在使用spring引导和spring-boot-maven-plugin生成war时排除application.properties

问题描述:

我使用的是使用spring引导开发web应用程序,并且想要生成war而不是jar。 http://spring.io/guides/gs/convert-jar-to-war/在使用spring引导和spring-boot-maven-plugin生成war时排除application.properties

但我想从战争中排除application.properties,因为我用@PropertySource(value = "file:${OPENSHIFT_DATA_DIR}/application.properties")获得对生产环境中的文件路径:

它以战争描述这里使用从罐子转换工作非常精细。生成我的抗战时

  • 此方法的工作,但在Eclipse中我不能运行我的应用程序,因为根本没有复制application.properties目标/类:

    <build> <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>application.properties</exclude> </excludes> </resource> </resources> </build>

  • 这种方法不工作的时候,我觉得春天启动了Maven插件不支持packagingExcludes:

    <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <packagingExcludes>WEB-INF/classes/application.properties</packagingExcludes> </configuration> </plugin> </plugins> </build>

你有另外一个建议吗?

Thnks

+0

我对这个问题的办法是刚过保持资源application.properites使用'spring.config.location'参数覆盖打包配置。例如,我将它设置在Tomcat的上下文文件中,以指向我在生产环境中使用的配置文件。你有没有尝试过这样做,或者这种解决方案不适合你吗? 或者你可以通过使用不同的Maven构建配置文件进行开发和生产,或许可以实现你正在尝试做的事情?我的意思是,只有当您使用生产Maven配置文件打包您的应用时,才会排除application.properties ... – 2014-11-04 20:25:05

+0

我只想在使用maven打包我的战争时排除application.properties,其他一切正常。我不想在生成战争后删除application.properties。 – amgohan 2014-11-05 00:09:12

我添加的解决方案是我的解压打包战争,删除文件application.properties并创建一个使用maven-antrun-插件名为ROOT.war新的战争和运行一些Ant任务。

这是我加入到我的插件在pom.xml中:

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-antrun-plugin</artifactId> 
<executions> 
    <execution> 
     <id>package</id> 
     <phase>package</phase> 
     <configuration> 
      <target> 
       <unzip src="target/${artifactId}-${version}.${packaging}" dest="target/ROOT/" /> 
       <delete file="target/ROOT/WEB-INF/classes/application.properties"/> 
       <zip destfile="target/ROOT.war" basedir="target/ROOT" encoding="UTF-8"/> 
       <delete dir="target/ROOT"/> 
      </target> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
    </execution> 
</executions> 
</plugin> 

我叫我的目标战争ROOT.war因为我使用openshift PaaS的tomcat的,所以我只是复制我ROOT.war并推向我的openshift回购。就是这样

+0

恕我直言,正确的答案。我需要它稍微扭曲:我想包括'application.properties',但没有我的个人资料'应用程序 - *。属性'。而且由于我的ANT时代早已过去,我花了一段时间才弄清楚正确的语法,因此发布在这里: '' – 2015-10-21 16:54:40

我从你的问题中了解到,你想为你的开发使用application.properties。但是你不想用它来制作。

我会建议使用弹簧配置文件来实现这一点。 在您的属性文件中

  1. 创建一个用于开发的配置文件。把你所有的开发属性放在它下面。
  2. 不要在属性文件中为生产创建配置文件。
  3. 当您正在开发时,将活动配置文件设置为开发,以便从您的application.properties文件加载属性。
  4. 在生产中运行它时,将活动配置文件设置为生产。尽管application.properties将被加载到您的WAR中,但由于没有用于生产的配置文件,因此不会加载任何属性。

我使用YML做了类似的事情。我相信也一定有办法使用.properties文件做同样的事情。

spring: 
    profiles.active: development 
-- 
spring: 
    profiles: development 
something: 
    location: USA 
    unit1: Test1 
    unit2: Test2 

你可以使用

-Dspring.profiles.active=production 
+0

是和否。如果将这些配置文件属性文件存储在src/main/resources中,则不能从父类加载器加载它们(如将它们放入$ TCHOME/lib中),因为它们已经捆绑在WAR本身中 – 2015-10-21 16:52:57

改变运行时配置文件尝试使用此解决方案:

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <version>${spring.version}</version> 
    <configuration> 
     <addResources>false</addResources> 
    </configuration> 
</plugin> 

<addResources>假</addResources >将继续属性时你运行mvn spring-boot:运行

请尝试使用下面的解决方案。这将工作:

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <excludes> 
       <exclude>**/*.properties</exclude> 
      </excludes> 
     </resource> 
    </resources> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 

如果使用上述解决方案,同时在Eclipse IDE中运行该项目,你可能会得到错误的属性文件未找到。为了摆脱这个,你需要添加资源文件夹作为配置运行(运行配置... - >类路径 - >用户条目 - >高级... - >添加文件夹)

在Eclipse中运行时,在你的运行配置,你需要指定到春季启动化子性质的路径:

--spring.config.location=${workspace_loc:/YOURPROYECTNAME}/src/main/resources/ 

它即使生成jar包,即使<addResources>false</addResources>