Java 根据活动的spring概要文件创建一个maven依赖项

Java 根据活动的spring概要文件创建一个maven依赖项,java,spring,maven,tomcat,spring-boot,Java,Spring,Maven,Tomcat,Spring Boot,因此,我正在构建一个SpringBootWeb应用程序,将其打包为war,并部署到tomcat应用服务器 tomcat的pom.xml中有以下依赖项: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided&l

因此,我正在构建一个SpringBootWeb应用程序,将其打包为war,并部署到tomcat应用服务器

tomcat的pom.xml中有以下依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

org.springframework.boot
弹簧启动机tomcat
假如
需要提供此依赖关系的范围,以便能够将其部署到tomcat实例。但是,当我想通过spring boot CLI或IntelliJ的默认spring boot运行配置运行war时,我需要删除提供的
,以便它运行嵌入式tomcat


我的问题是,是否有某种方法可以基于活动的spring概要文件或其他方法有条件地提供依赖关系?

您无法通过spring概要文件控制依赖关系。但是,您可以通过maven配置文件控制弹簧配置文件,它可以解决您的问题

您可以在应用程序中声明几个maven概要文件,并为每个概要文件提供不同的依赖项集。 然后您可以配置maven配置文件以使用特定的spring配置文件。
请看一看此类配置的示例

在您的特定情况下,您只需执行以下操作: 在使用嵌入式tomcat运行spring boot的依赖项中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>  

这是一个可以同时使用jar和war包装的解决方案:

pom.xml

    ...
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>...</artifactId>
    <groupId>...</groupId>
    <version>0-SNAPSHOT</version>
    <packaging>${packaging.type}</packaging>
    ...
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <start-class>...</start-class>
        <packaging.type>jar</packaging.type>
    ...
    </properties>
    <dependencies>
        <dependency>
            <!-- Brings in Embedded Tomcat dependencies -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
...
    </dependencies>

    <profiles>
        <profile>
            <id>tomcat-war</id>
            <properties>
                <packaging.type>war</packaging.type>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
    ...
    </profiles>

    <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
    ...
将工件构建为战争:

mvn clean package -Ptomcat-war
主类,该类位于pom.xml中的

package ...

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

上一次尝试(大约3个月前)我可以将我的war部署到tomcat上,即使其中包含嵌入式tomcat。它工作得很好。这场战争只不过是比它应该的规模大了一点而已!不确定这种方法在最新版本的spring boot中是否仍然有效。请不要。。。不,真的不。。。让它保持原样,并使用maven spring引导任务从Intellij中运行应用程序。此外,当运行war时,应该没有问题,因为spring将提供的依赖项打包在一个单独的目录中,spring Boot仍然会扫描这些依赖项。@M.Deinum您应该将其作为一个答案发布—这对我来说很有用
mvn clean package
mvn clean package -Ptomcat-war
package ...

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}