2017-02-17 102 views
3

因此,我构建了一个spring引导web应用程序,打包为一个war,并部署到一个tomcat应用程序服务器。根据主动弹簧配置文件提供maven依赖关系

我在我的pom.xml以下依赖性为Tomcat:

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

这种依赖关系的范围需要为了能够将其部署到Tomcat实例来提供。但是,当我想通过弹簧引导CLI或通过IntelliJ的默认弹簧引导运行配置运行战争时,我需要删除<scope>provided</scope>以使其运行嵌入式tomcat。

我的问题是,是否有某种方法可以根据有效的弹簧配置文件或其他方法有条件地提供依赖项?

+0

我最后一次尝试(大约3个月前),我可以我的战争部署到Tomcat,即使包含在一个嵌入式的Tomcat它。它运行良好。这场战争比原本应该大一点!但不确定这种方法在最新版本的spring-boot中是否仍然有效。 –

+2

不要...不要......不要......保持它提供的状态,并使用maven spring引导任务从Intellij中运行你的应用程序。另外,在运行战争时,应该没有问题,因为spring将所提供的依赖项打包在单独的目录中,这些目录仍然由Spring Boot扫描。 –

+0

@ M.Deinum你应该发布这个答案 - 对我有用 –

回答

2

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

您可以在您的应用程序中声明几个maven配置文件,并为它们中的每一个提供不同的依赖关系集。 然后,您可以配置maven配置文件以使用特定的弹簧配置文件。 看看on maven profiles和这样的配置in this thread

1

的例子。在特定情况下,你可以这样做: 在依赖与嵌入式Tomcat的运行春季启动:

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

并在配置tomcat下部署

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

之后,建立针对特定的个人资料

mvn clean install -Ptomcat 
0

这是将与两个合作的解决方案,罐子和战争包装:

的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 

构建神器作为战争:

mvn clean package -Ptomcat-war 

主类,即在云中<start-class> 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); 
    } 
}