在WAR的WEB-INF / lib文件夹中重命名Maven依赖项

时间:2011-02-11 13:04:51

标签: java maven-2 maven-3

我需要在Maven生成的WAR的WEB-INF/lib文件夹中有一个JAR依赖项x-1.0.final.jar而不是x-1.0.jar,这是它在存储库中的名称。实现这一目标的最佳方法是什么?

在我的POM中我有:

<dependency>
  <groupId>foo</groupId>
  <artifactId>x</artifactId>
  <version>1.0</version>
</dependency>

我希望它在WEB-INF/lib文件夹中显示为x-1.0.final.jar

这是对Maven Central的外部依赖我无法控制。此外,我不想强​​迫每个人使用它将依赖项重新部署到他们的本地存储库。

我是否可以使用Maven插件,还是应该开始编写自己的插件?

4 个答案:

答案 0 :(得分:29)

您可以使用maven-dependency-plugin在您需要的名称下包含工件。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <goals>
          <goal>copy</goal>
        </goals>
        <configuration>
          <artifactItems>
            <artifactItem>
              <groupId>foo</groupId>
              <artifactId>x</artifactId>
              <version>1.0</version>
              <type>jar</type>
              <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>
              <destFileName>x-1.0.final.jar</destFileName>
            </artifactItem>
          </artifactItems>
        </configuration>
      </execution>
    </executions>
</plugin>

默认情况下,maven-dependency-plugin绑定到process-sources阶段,这似乎足以完成您的任务。请记住为依赖项中的工件设置范围provided,以便war插件不会自动包含它。

答案 1 :(得分:4)

您可能想看看outputFileNameMappingmaven war plugin参数是否可以为您提供帮助。

答案 2 :(得分:1)

对不起,我完全不明白你的问题,你在POM中导入这个jar的代码是什么?

如果要导入的Jar在存储库中被调用,并且您要在POM中导入正确的文件,那么您不必担心JAR文件的命名约定。

我相信您可能需要做的是重命名存储库中的文件,只需在资源管理器窗口中进入Repository Users / .m2并跟踪文件并重命名,注意这可能会产生影响在其他项目上。

我建议您复制文件重命名并使用新工件ID x-1.0.final.jar将其添加到存储库

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

填写&lt;&gt;

希望这会有所帮助 克里斯

答案 3 :(得分:1)

我知道我回复了一个旧帖子,但我需要执行上述操作并发现此帖子很有帮助。我发现实现这一目标的方法是执行两个步骤:

  1. 使用maven-war-plugin从交付项中排除原始jar文件。
  2. 使用maven-dependency-plugin将原始jar文件复制到新命名的jar文件中,并将其放在WEB-INF / lib目录中。
  3. 因此,举例来说,这是指定要排除的文件的方式。在这种情况下x-1.0.jar:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <!-- Exclude file: x-1.0.jar from packaging -->
            <packagingExcludes>WEB-INF/lib/x-1.0.jar</packagingExcludes>
        </configuration>
    </plugin>
    

    同时指定必须将文件的副本执行到新名称(x-1.0.final.jar),但这需要在打包之前运行。这由阶段指定:&#39; prepare-package&#39;:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <phase>prepare-package</phase>
                <goals>
                    <goal>copy</goal>
                </goals>
                <configuration>
                    <artifactItems>
                        <artifactItem>
                            <groupId>the group of the x jar</groupId>
                            <artifactId>x</artifactId>
                            <type>jar</type>
                            <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>
                            <destFileName>x-1.0.final.jar</destFileName>
                        </artifactItem>
                    </artifactItems>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    在我的例子中,我并不是硬编码1.0,但我认为这应该适用于原始海报问题。