如何将多模块 spring maven 项目中的属性文件添加到 class 路径?
How to add properties files in multi module spring maven project to class path?
我有一个多模块 Maven spring 引导项目,其中包含 2 个服务(可执行 jar)和 3 个库(仅作为依赖项加载)。
项目结构是
|--- Parent Project
| |--- pom.xml
| |--- libraries
| | | --- lib1
| | | |--- some code
| | | |--- pom.xml
| | |--- lib2
| | | |--- some code
| | | |--- pom.xml
| |--- services
| | | --- service1
| | | |--- src
| | | | |--- main
| | | | |--- ressources
| | | | | |--- several .properties files
| | | |--- pom.xml
| | | --- service2
| | | |--- src
| | | | |--- main
| | | | |--- ressources
| | | | | |--- several .properties files
| | | |--- pom.xml
我的依赖项运行良好,我可以完全使用这些模块,在父 pom 中配置如下
<groupId>com.company.project</groupId>
<artifactId>app</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>
<modules>
<module>libraries/lib1</module>
<module>libraries/lib2</module>
<module>services/service1</module>
<module>services/service2</module>
</modules>
...
但是我在构建过程中遇到了问题。这在父 pom
中配置为
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skip>true</skip>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
目前我只想构建service1。构建过程也有效。在service1的pom中配置如下:
<build>
<resources>
<resource>
<directory>resources</directory>
<filtering>true</filtering>
<targetPath>${target.directory}</targetPath>
<includes>
<include>*.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.soemstuff.mainclass</mainClass>
<outputDirectory>${target.directory}</outputDirectory>
<finalName>service1-${revision}</finalName>
<fork>true</fork>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<overwrite>true</overwrite>
<outputDirectory>${target.directory}</outputDirectory>
<resources>
<resource>
<directory>${basedir}</directory>
<filtering>false</filtering>
<includes>
<include>Dockerfile</include>
</includes>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
如前所述,我在项目根目录的 target/service1 目录中创建了一个可执行 jar。但是 spring 启动失败,因为它说 spring.properties (我定义了几个配置文件,一个都找不到)不存在。如果我从 IntelliJ 启动项目,它会起作用(我用注释定义了属性文件)。
事实上,当我删除所有目标目录并在根 pom 中使用“mvn package”时,maven 还会生成子模块 (service1) 的目标。现在,当我在 IntelliJ 中启动它时,它也找不到属性文件。当我之后删除 service1 的目标文件夹并从 IntelliJ 启动它时它起作用了。
谁能帮我把属性打包到罐子里?也可以选择将文件复制到与 .jar 相同的目录中,但我试过了 spring 找不到它,因为它显然不在 class 路径中。
看来,问题出在我 service1.pom 中的 maven 资源插件,我用它来将 Dockerfile 复制到根目录中的自定义目标目录。我删除了插件,现在构建工作正常。
没关系,但我找不到原因。如果有人知道其中的原因,请随时发表评论。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<overwrite>true</overwrite>
<outputDirectory>${target.directory}</outputDirectory>
<resources>
<resource>
<directory>${basedir}</directory>
<filtering>false</filtering>
<includes>
<include>Dockerfile</include>
</includes>
</resource>
</resources>
</configuration>
</plugin>
我有一个多模块 Maven spring 引导项目,其中包含 2 个服务(可执行 jar)和 3 个库(仅作为依赖项加载)。
项目结构是
|--- Parent Project
| |--- pom.xml
| |--- libraries
| | | --- lib1
| | | |--- some code
| | | |--- pom.xml
| | |--- lib2
| | | |--- some code
| | | |--- pom.xml
| |--- services
| | | --- service1
| | | |--- src
| | | | |--- main
| | | | |--- ressources
| | | | | |--- several .properties files
| | | |--- pom.xml
| | | --- service2
| | | |--- src
| | | | |--- main
| | | | |--- ressources
| | | | | |--- several .properties files
| | | |--- pom.xml
我的依赖项运行良好,我可以完全使用这些模块,在父 pom 中配置如下
<groupId>com.company.project</groupId>
<artifactId>app</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>
<modules>
<module>libraries/lib1</module>
<module>libraries/lib2</module>
<module>services/service1</module>
<module>services/service2</module>
</modules>
...
但是我在构建过程中遇到了问题。这在父 pom
中配置为 <build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skip>true</skip>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
目前我只想构建service1。构建过程也有效。在service1的pom中配置如下:
<build>
<resources>
<resource>
<directory>resources</directory>
<filtering>true</filtering>
<targetPath>${target.directory}</targetPath>
<includes>
<include>*.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.soemstuff.mainclass</mainClass>
<outputDirectory>${target.directory}</outputDirectory>
<finalName>service1-${revision}</finalName>
<fork>true</fork>
<skip>false</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<overwrite>true</overwrite>
<outputDirectory>${target.directory}</outputDirectory>
<resources>
<resource>
<directory>${basedir}</directory>
<filtering>false</filtering>
<includes>
<include>Dockerfile</include>
</includes>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
如前所述,我在项目根目录的 target/service1 目录中创建了一个可执行 jar。但是 spring 启动失败,因为它说 spring.properties (我定义了几个配置文件,一个都找不到)不存在。如果我从 IntelliJ 启动项目,它会起作用(我用注释定义了属性文件)。
事实上,当我删除所有目标目录并在根 pom 中使用“mvn package”时,maven 还会生成子模块 (service1) 的目标。现在,当我在 IntelliJ 中启动它时,它也找不到属性文件。当我之后删除 service1 的目标文件夹并从 IntelliJ 启动它时它起作用了。
谁能帮我把属性打包到罐子里?也可以选择将文件复制到与 .jar 相同的目录中,但我试过了 spring 找不到它,因为它显然不在 class 路径中。
看来,问题出在我 service1.pom 中的 maven 资源插件,我用它来将 Dockerfile 复制到根目录中的自定义目标目录。我删除了插件,现在构建工作正常。
没关系,但我找不到原因。如果有人知道其中的原因,请随时发表评论。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<overwrite>true</overwrite>
<outputDirectory>${target.directory}</outputDirectory>
<resources>
<resource>
<directory>${basedir}</directory>
<filtering>false</filtering>
<includes>
<include>Dockerfile</include>
</includes>
</resource>
</resources>
</configuration>
</plugin>