代码之家  ›  专栏  ›  技术社区  ›  Jim

如何过滤maven中的资源,替换为依赖项artifactid?

  •  5
  • Jim  · 技术社区  · 16 年前

    我正在尝试构建一个JAR,它有一个XML文件作为资源。我想对该XML应用一个过滤器,以便将依赖项的名称插入到XML中。过滤系统工作了,因为我能进去 ${project.build.finalName} 把它换掉。我发现 one hint 我要找的房产可能是

    ${project.dependencies[0].artifactId}
    

    但这似乎行不通。我想换一个

    <fileName>${project.dependencies[0].artifactId}</fileName>
    

    具有

    <fileName>OtherLibrary</fileName>
    

    有可能吗?

    XML,位于src/main/resources中:

    <somenode>
      <fileName>${project.dependencies[0].artifactId}</fileName>
    </somenode>
    

    pom.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <modelVersion>4.0.0</modelVersion>
    <groupId>com.foo</groupId>
    <artifactId>Thing</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>Thing</name>
    <url>http://maven.apache.org</url>
    <build>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.pts</groupId>
            <artifactId>OtherLibrary</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    </project>
    
    2 回复  |  直到 9 年前
        1
  •  7
  •   yair    9 年前

    该死,你说得对,这个属性不会在资源筛选过程中被替换。这很奇怪,听起来像是 Maven Resources Plugin 因为在 process-resources 我将在下面建议的解决方案中演示的阶段(基于MavenAntrun插件和 replace 任务)。

    首先,在POM中添加以下内容:

      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>process-resources</phase>
            <configuration>
              <tasks>
                <echo>${project.dependencies[0].artifactId}</echo><!-- I'm a test -->
                <replace file="${project.build.outputDirectory}/myxmlfile.xml" 
                         token="@@@" value="${project.dependencies[0].artifactId}"/> 
              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    

    然后,将XML文件更新为:

    <somenode>
      <fileName>@@@</fileName>
    </somenode>
    

    通过这些更改,运行 mvn process-resources 将产生以下结果:

    $ cat target/classes/myxmlfile.xml 
    <somenode>
      <fileName>OtherLibrary</fileName>
    </somenode>
    

    这证明了属性是内插的(但在对资源进行maven筛选时未设置) . 如果您需要筛选多个文件, 代替 任务可以获取文件集。适应你的需要。

    事实上,在 Maven 2.x Resources Plugin . 我创造了 MRESOURCES-118 .

        2
  •  1
  •   Brett Porter    16 年前

    由于maven插入pom的方式,索引属性仅在插件配置中可用,因此它可用于Antrun的替换任务,但不用于筛选。

    然而,通过索引访问依赖项并不是非常健壮——它容易受到父级的变化的影响。您可以在 pom.xml :

    <properties>
      <fileName>some-name</fileName>
    </properties>
    ...
    <dependency>
      <groupId>your.group.id</groupId>
      <artifactId>${fileName}</artifactId>
      ...
    </dependency>
    

    然后可以继续使用属性名进行筛选:

    <somenode>
      <fileName>${fileName}</fileName>
    </somenode>
    
    推荐文章