【问题标题】:How to add properties files in multi module spring maven project to class path?如何将多模块spring maven项目中的属性文件添加到类路径?
【发布时间】:2021-05-26 02:06:42
【问题描述】:

我有一个多模块 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>
...

但是我在构建过程中遇到了问题。 this 在父 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 启动项目,它可以工作(我用注释定义了属性文件)。

Funfact,当我删除所有目标目录并在根 pom 中使用“mvn package”时,maven 也会生成子模块的目标(service1)。现在,当我在 IntelliJ 中启动它时,它也找不到属性文件。当我之后删除 service1 的目标文件夹并从 IntelliJ 启动它时它可以工作。

谁能帮我把属性打包到罐子里?将文件复制到与 .jar 相同的目录中也是一种选择,但我试过了,spring 找不到它,因为它显然不在类路径中。

【问题讨论】:

    标签: java spring spring-boot maven properties


    【解决方案1】:

    看来,我的 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>
    

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 2012-04-13
      • 2013-11-25
      • 1970-01-01
      • 2018-03-28
      • 2013-07-14
      • 1970-01-01
      • 2011-04-15
      • 2018-04-23
      相关资源
      最近更新 更多