【问题标题】:Renaming Maven dependency in WAR's WEB-INF/lib folder重命名 WAR 的 WEB-INF/lib 文件夹中的 Maven 依赖项
【发布时间】:2011-06-25 13:18:24
【问题描述】:

我需要在 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>

我希望它以x-1.0.final.jar 的形式出现在WEB-INF/lib 文件夹中。

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

是否有我可以使用的 Maven 插件,或者我应该开始自己编写代码?

【问题讨论】:

  • 如果你不能把它放到网上,又不想让他们把它放到本地,你怎么让他们找到图书馆?
  • 是外部第三方依赖。它在 Maven Central 上在线。 JAR 的名称不适用于我的用法。我想重命名进入WEB-INF/lib 目录的内容。
  • 我认为不存在这样的解决方案来重命名文件夹中的内容。
  • 您可以尝试编写自己的 maven 插件来做到这一点。
  • maven.apache.org/plugins/maven-war-plugin/examples/…我自己没用过,但是好像可以把jar排除在war中。

标签: java maven-2 maven-3


【解决方案1】:

您可以使用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 插件不会自动包含它。

【讨论】:

  • 此解决方案排除重命名库的所有依赖项
  • 小心 destFileName 必须在 artifactItem 元素中,我的在外面,它不起作用。当我复制到 artifactItem 标签下时问题消失了
  • 这是一个好的开始。如果您将依赖项重命名为常规依赖项,则将包含所有传递依赖项。然后在 war 插件中编辑 以排除 x.jar。为您提供两全其美的体验。
【解决方案2】:

您可能想看看maven war pluginoutputFileNameMapping 参数是否可以帮助您。

【讨论】:

    【解决方案3】:

    我知道我正在回复一个旧线程,但我需要执行上述操作并发现此线程很有帮助。我发现实现这一点的方法是执行一个两步过程:

    1. 使用 maven-war-plugin 从交付项中排除原始 jar 文件。
    2. 使用 maven-dependency-plugin 将原始 jar 文件复制到新命名的 jar 文件中,并将其放在 WEB-INF/lib 目录中。

    因此,作为说明,这是指定要排除的文件的方法。在这种情况下 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),但这需要在打包之前运行。这是由阶段指定的:'prepare-package':

    <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,但我认为这应该适用于原始海报问题。

    【讨论】:

      【解决方案4】:

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

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

      我相信您可能需要做的是重命名存储库中的文件,您只需在资源管理器窗口中进入存储库用户/.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>
      

      填写

      希望这会有所帮助 克里斯

      【讨论】:

      • 存储库有一个 JAR 名称,这与我的 WAR 中需要的名称不同。我无法控制远程存储库,也不想强迫使用它的每个人将依赖项重新部署到他们的本地存储库中。
      猜你喜欢
      • 2011-05-15
      • 2012-04-22
      • 2014-04-23
      • 2014-11-24
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      相关资源
      最近更新 更多