Java 如何从spring引导jar中排除资源文件?
我正在使用Java 如何从spring引导jar中排除资源文件?,java,maven,spring-boot,Java,Maven,Spring Boot,我正在使用maven-spring-boot插件生成jar。我有多个配置资源文件(application-production.yml、application-test.yml、application development.yml) 问题是,当我为我们的客户生成发行版时,我想排除开发和测试文件。是否可以在maven-spring-bootplugin中排除资源文件 我试过这个: <build> <resources>
maven-spring-boot
插件生成jar。我有多个配置资源文件(application-production.yml、application-test.yml、application development.yml
)
问题是,当我为我们的客户生成发行版时,我想排除开发和测试文件。是否可以在maven-spring-boot
plugin中排除资源文件
我试过这个:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application-dev*</exclude>
<exclude>application-test*</exclude>
</excludes>
</resource>
</resources>
</build>
没有它,它工作正常。使用maven资源插件和maven配置文件,而不是使用maven spring引导插件:
<profiles>
<profile>
<id>prod</id>
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>[your directory]</directory>
<excludes>
<exclude>[non-resource file #1]</exclude>
<exclude>[non-resource file #2]</exclude>
<exclude>[non-resource file #3]</exclude>
...
<exclude>[non-resource file #n]</exclude>
</excludes>
</resource>
</resources>
</build>
</profile>
</profiles>
要查看更多maven资源插件示例,请查看
如果您想了解更多关于配置文件的信息,请使用maven resources插件查看一下,它支持排除标记 顺便问一下,为什么需要使用三个yaml文件?您可以使用“---”和spring.profiles将这些配置写入一个application.yaml文件,如:
memcached.addresses: test03:11211
spring.profiles.active: dev
---
# dev
spring:
profiles: dev
logging.access.enabled: false
---
# test
spring:
profiles: test
logging.config: classpath:log4j.test.properties
logging.access.dir: /home/shared/log
---
# online
spring:
profiles: online
logging.config: classpath:log4j.online.properties
logging.access.dir: /home/shared/log
SpringBootMaven插件重新打包Maven JAR插件创建的JAR文件。因此,您还可以选择在第一次构建JAR时简单地排除文件,这使得Spring Boot Maven插件无法首先找到它们:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<excludes>
<exclude>application-dev*</exclude>
<exclude>application-test*</exclude>
</excludes>
</configuration>
</plugin>
org.apache.maven.plugins
maven jar插件
3.1.0
应用程序开发*
应用测试*
maven资源插件不使用就地编辑属性值。这就是为什么不能在属性文件中使用@project.version@的原因。请确保已指定true
谢谢。最后我回到这条线索上,你真的解决了。。伟大的Spring boot还支持多个现成的应用程序-{profile}.yml
文件。maven-resource-plugin不支持就地替换@value@标记。引导插件可以做到这一切,为什么要排除它们?是因为您不想让他们看到这些文件,还是因为它们导致了错误?Spring boot默认支持多个application-{profile}.yml
文件,所以这不应该是一个问题。是的,我不希望每个版本都删除客户看不到的文件(test/dev db等的密码)。另一个选项是使用参数运行spring boot jar,从而设置所有必需的值——但这并不一定令人满意。您还可以拥有一个外部应用程序.properties
文件(与应用程序jar/WAR位于同一文件夹中)。我确信,通过一些Maven调整,您可以实现您的目标,但我认为你不应该以这种方式创建工件。生成的jar不应该包含生产属性,而应该是jar的外部属性,如果您遵循这些属性,可以通过springboot自动获取这些属性conventions@g00glen00b,您希望排除它们的一个原因是将开发/测试工件排除在生产交付之外。许多代码扫描器会认为他们的存在是安全的发现。这是最好和最干净的解决方案IMHO,允许使用Spring Boover Maven插件。这个答案不包括配置文件。通常情况下,每个配置文件都不包括资源,并且在回答中不包括配置文件。
memcached.addresses: test03:11211
spring.profiles.active: dev
---
# dev
spring:
profiles: dev
logging.access.enabled: false
---
# test
spring:
profiles: test
logging.config: classpath:log4j.test.properties
logging.access.dir: /home/shared/log
---
# online
spring:
profiles: online
logging.config: classpath:log4j.online.properties
logging.access.dir: /home/shared/log
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<excludes>
<exclude>application-dev*</exclude>
<exclude>application-test*</exclude>
</excludes>
</configuration>
</plugin>