如何将多模块spring maven项目中的属性文件添加到类路径?

kzmpq1sx  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(273)

我有一个多模块maven-spring-boot项目,包含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中配置为this

<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里吗?也可以选择将文件复制到与.jar相同的目录中,但我尝试了,spring找不到它,因为它显然不在类路径中。

6pp0gazn

6pp0gazn1#

似乎,我的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>

相关问题