【问题标题】:Maven Read properties plugin doesn't substitute values for dependenciesMaven 读取属性插件不会用值替换依赖项
【发布时间】:2016-08-01 06:08:24
【问题描述】:

以下是我的项目结构。

test-proj
   |_ src
     |_main
     |   |_java
     |_test
         |_java
   |_prop.properties
   |_pom.xml

还有我的 pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <!-- The resources tag will be used if prop file is under src location. -->
    <!--    <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources> -->
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <version>1.0.0</version>
                <executions>
                    <execution>
                        <phase>initialize</phase>
                        <goals>
                            <goal>read-project-properties</goal>
                        </goals>
                        <configuration>
                            <files>
                                <file>${basedir}/prop.properties</file> 
                            </files>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring-version}</version>
        </dependency>
    </dependencies>
</project>

Prop.properties 文件有

spring-version=3.1.0.RELEASE

我尝试使用 maven-read 属性插件来读取属性并用它代替 spring 版本。但是它会抛出错误,说 org.springframework:spring-beans:jar 的 'dependencies.dependency.version' 必须是有效版本,但是是 '${spring-version}'。

我尝试在 Maven 执行阶段使用验证阶段而不是初始化。但问题仍然存在。我尝试将属性文件位置替换为配置中的绝对路径 D:\test-proj\prop.properties 而不是上下文路径,这对我也没有帮助。我正在使用 maven 编译器插件版本 2.3.2。我错过了什么吗?请让我知道用其他插件替换依赖版本是否可行。

注意:我将无法使用父子 pom 关系,因为我所有的项目都是模块化的,它们不依赖于同一个父项

【问题讨论】:

  • 你的属性真的在 basedir 文件夹上吗? basedir 表示项目的根文件夹,即 pom.xml 文件所在的位置。我认为您的属性可能在资源文件夹中,对吧?
  • @dambros 我尝试将它放在根目录和资源中。如您所见,prop.properties 的当前位置是 pom.xml 可用的根文件夹,我将其称为 ${basedir.properties}/prop.properties
  • 有什么特别的理由不在 pom 内部声明依赖版本吗?这里只是想了解一下插件的使用方法,因为看起来有点矫枉过正
  • @dambros 我的大多数项目都是独立的,但很少有共同的属性,如 sql 版本、spring 版本等。所以我想在属性文件中声明这些公共属性并在需要的地方使用它们.父子无法工作,因为我的项目结构不是这样设计的。
  • @Poppy 好点;告诉我们你想要实现什么。版本保存在 pom.xml 中有什么问题

标签: java spring maven dependencies pom.xml


【解决方案1】:

如果您想要多个不相关的项目共享依赖版本,您可以使用物料清单概念http://howtodoinjava.com/maven/maven-bom-bill-of-materials-dependency/

  1. 使用包装 pom 创建不相关的 BOM 项目。将共享依赖项添加到项目中
  2. 您的每个项目都必须导入 BOM 项目

下面是示例页面中的 sn-p

如何添加 BOM [Bill Of Materials] 依赖

Maven为此提供了一个标签dependencyManagement。您需要在此标签中添加 bom 信息,如下所示。我以 Spring bom 文件为例。

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-framework-bom</artifactId>
      <version>4.0.1.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

使用 BOM 的另一个好处是,当依赖 Spring Framework 工件时,您不再需要指定版本属性。所以它会工作得很好。

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
</dependency>

【讨论】:

  • 恐怕如果我没有正确理解。根据我的理解,理想情况下,依赖管理将在父 pom 中定义,并且可以在继承父 pom 的子 pom 中使用相同的依赖版本。就我而言,这些项目可能不会继承相同的父项。
  • @Poppy 在我的提案依赖管理部分必须在每个项目中独立定义但是单个条目(单个 BOM)可能包含对 Spring、sql、apache-commons 版本的数十个依赖项)
【解决方案2】:

我无法想象这会奏效。 AFAIU Maven 必须在任何构建执行之前解决依赖关系,否则它应该如何为执行创建适当的类路径?

回复:

我将无法使用父子 pom 关系,因为我的所有项目都是模块化的,并且它们不依赖于同一个父级。

我认为你可以。建立一个super-parent POM,其中包含要被所有人继承的适当设置,并使您所有项目的父项成为此项的子项:

+- super-parent
  +- pom.xml ... containing setting(s) for all
  +- parent-project-1
     +- ...
  +- parent-project-2
     +- ...
  +- ...    

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多