使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源
Posted
技术标签:
【中文标题】使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源【英文标题】:resources in a Spring Boot application are missing from jar file when using Spring Boot Maven Plugin 【发布时间】:2016-01-16 18:51:21 【问题描述】:我正在使用 Spring-Boot v1.3.0.M5 和 Maven v3.3.3。我以前可以使用这个命令从控制台运行我的 Spring Boot (boot) 应用程序。
mvn clean package spring-boot:run
但是,我不得不修改我的pom.xml
以适应不同的环境构建。特别是,我正在使用 Maven 配置文件来修改启动应用程序的属性文件。现在,当我运行前面提到的命令时,启动应用程序无法运行并抱怨以下异常。
原因:java.lang.NumberFormatException:对于输入字符串:“$MULTIPART.MAXREQUESTSIZE”
我有一个位于src/main/resources/config/application.properties
的属性文件。这个属性文件有一堆键值对,如下所示。
multipart.maxFileSize=$multipart.maxFileSize
multipart.maxRequestSize=$multipart.maxRequestSize
然后在我的pom.xml
中,我的构建定义如下。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<profiles>
<!-- development -->
<profile>
<id>env-dev</id>
<activation>
<activeByDefault>true</activeByDefault>
<property>
<name>env</name>
<value>dev</value>
</property>
</activation>
<properties>
<multipart.maxFileSize>250MB</multipart.maxFileSize>
<multipart.maxRequestSize>250MB</multipart.maxRequestSize>
</properties>
</profile>
<!-- staging -->
<profile>
<id>env-stg</id>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>env</name>
<value>stg</value>
</property>
</activation>
<properties>
<multipart.maxFileSize>500MB</multipart.maxFileSize>
<multipart.maxRequestSize>500MB</multipart.maxRequestSize>
</properties>
</profile>
<profiles>
我注意到,如果我输入 mvn clean package
并查看 jar
文件,application.properties
文件就在 jar 中。
但是,如果我输入mvn clean package spring-boot:run
,则applications.properties
文件在 jar 中不是。事实上,src/main/resources
下的任何内容都不会进入 jar 文件。
这个问题对我来说有点烦人,因为如果我想从命令行运行我的启动应用程序,我现在必须执行两个步骤。
mvn clean package
java -jar ./target/app-0.0.1-SNAPSHOT.jar
关于我做错了什么有什么想法吗?
【问题讨论】:
【参考方案1】:由于Spring Boot 1.3,为了按预期过滤资源,我们必须使用新的@@
格式:
some.key = @value@
而不是经典:
some.key = $value
相关 spring-boot 问题:https://github.com/spring-projects/spring-boot/issues/980
【讨论】:
【参考方案2】:由于described in the documentation mvn spring-boot:run
在您的类路径前添加src/main/resources
以默认支持热重载。您可以轻松关闭此功能
<build>
...
<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.2.7.RELEASE</version>
<configuration>
<addResources>false</addResources>
</configuration>
</plugin>
...
</plugins>
...
</build>
【讨论】:
我尝试将我的 spring-boot 版本升级到 1.3.2.RELEASE,现在你提出的解决方案中断了。正在复制属性文件,但 Maven 构建没有替换属性值。你推荐给我的文档甚至说Note that a side effect of using this feature is that filtering of resources at build time will not work.
有什么想法吗?我不想发布新问题。
Read the release notes?我认为这与您的问题无关。这只是控制使用 Maven 插件运行应用程序时发生的情况。
我和你有同样的问题,你如何解决这个问题?【参考方案3】:
试试这个:
<resources>
<resource>
<directory>src/main/resources/config</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
【讨论】:
这是我第一次尝试,但没有成功。有了这个我得到了这个例外:FileNotFoundException: class path resource [config/custom-application.properties] cannot be opened because it does not exist
。请注意,除了 Spring Boot application.properties
文件之外,我还有一个附加文件 custom-application.properties
也在 src/main/resources/config
目录中(我实际上是手动加载此属性文件)。谢谢,但这不起作用或没有帮助。同样,src/main/resources
中的任何内容都不会被复制到 jar 或 target/classes
目录中。
这个解决方案对我有用。我有一些想要包含的 .jrxml 文件。
小心如果你有一个覆盖资源/资源/目录有时它禁用默认的,所以你也必须手动将它添加回那里......另请参阅***.com/questions/35417086/…以上是关于使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot-maven插件repackage(goal)的那些事