【问题标题】:Maven deploy jar with dependencies to repoMaven 将 jar 与依赖项部署到 repo
【发布时间】:2012-12-01 15:53:28
【问题描述】:

我可以通过在我的pom.xml 中使用以下内容并运行mvn deploy 来部署jar

    <distributionManagement>
    <repository>
        <id>releases</id>
        <url>http://${host}:8081/nexus/content/repositories/releases</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <name>Internal Snapshots</name>
        <url>http://${host}:8081/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
</distributionManagement>

我可以使用以下代码构建一个可执行文件jar-with-dependencies

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>create-executable-jar</id>
                    <phase>deploy</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <archive>
                            <manifest>
                                <mainClass>my.company.app.Main</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </execution>
            </executions>
        </plugin>

问题是我不知道如何将这些组合在一起以将可执行文件 jar 部署到我的 Maven 存储库。我真的不知道这是通过新插件还是通过向现有程序集插件添加目标或其他步骤来完成的。

【问题讨论】:

  • 有趣...所以您想要一个包含所有依赖项 (jar-with-dependencies) 到 nexus 的 jar?我假设当你将它部署到生产环境时,这个 jar 将是独立的(因为它嵌入了所有依赖项)?

标签: java maven deployment


【解决方案1】:

如果您将程序集绑定到打包阶段,它会在您进行构建时在您的存储库中安装“常规”jar 和带有依赖项的 jar:

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>my.company.app.Main</mainClass>
                </manifest>
            </archive>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id> <!-- this is used for inheritance merges -->
                <phase>package</phase> <!--  bind to the packaging phase -->
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

然后只需运行 mvn clean install deploy 将两个 jar 上传到您的存储库。

【讨论】:

    【解决方案2】:

    为了构建(所谓的)Über JAR 并使用 maven 部署它,您还可以使用 shade plugin。以下代码取自他们的网站,但我已经使用此功能制作了一两个项目。

     <project>
      ...
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.0</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
                <configuration>
                  <shadedArtifactAttached>true</shadedArtifactAttached>
                  <shadedClassifierName>jackofall</shadedClassifierName> <!-- Any name that makes sense -->
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      ...
    </project>
    

    在此配置中,除了普通 JAR 之外,您还可以将 Über JAR 作为一个部署。然后,您的 JAR 用户可以根据分类器决定提取一体化包或具有依赖关系的 JAR。

    我通常会使用 shade 插件来构建 Über JAR(或以某种方式修改 JAR)并使用程序集插件来构建安装包(包含 JAR 和可能的其他内容)之类的东西。但是,我不确定单个插件的预期目标是什么。

    【讨论】:

      【解决方案3】:

      以下工作。我将把这个问题稍微开放一下,因为我不肯定这是最佳做法,但工作很重要。

      我注意到的问题是我编造了 ID 名称,我不知道这是否是惯例,我必须对 jar 名称进行硬编码;它不是从其他任何东西推断出来的。

      <plugin>
      <artifactId>maven-deploy-plugin</artifactId>
      <version>2.7</version>
      <executions>
          <execution>
              <id>deploy-executable</id>
              <goals>
                  <goal>deploy-file</goal>
              </goals>
              <configuration>
                  <file>target/Monitoring-Client-1.0-SNAPSHOT-jar-with-dependencies.jar</file>
              </configuration>
          </execution>
      </executions>
      </plugin>
      

      【讨论】:

      • 看起来不错,但不幸的是对我不起作用:无法执行目标 org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy-file (default-cli) on项目 BackofficeSmokeTest:目标 org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy-file 的参数 'file'、'url' 丢失或无效 -> [帮助 1]
      • 我希望该项目应该在search.maven.org上可用
      【解决方案4】:

      基本上我这样做的困难表明我的pom.xml 已经偏离了轨道。一切都会自行到位。我以前在做:

      • 将所有依赖项保存到 lib 文件夹中
      • 构建一个带有类路径的 jar 文件,以覆盖该 lib 文件夹
      • 使用组装插件制作另一个可部署的 jar

      我认为在此过程中这种做法之所以有意义有几个原因,尤其是当我的库没有从我的应用程序中很好地考虑时。

      但是,通过删除 1 和 2,只需要 distributionManagement 部分,并且部署阶段会自动运行。所以总而言之,这是一个通过删除大量代码来添加功能的惊人案例。

      【讨论】:

      • 我有相同的症状,即 *jar-with-dependencies.jar 没有被部署推送。我的问题是插件配置不正确 - 我必须按照文档 (maven.apache.org/plugins/maven-assembly-plugin/usage.html) 中的说明绑定到包阶段
      • @ahains 谢谢!那是一个更好的解决方案。请对此做出回答,以便我可以真正支持你:)
      【解决方案5】:

      首先,您不应该在部署阶段创建 ueber jar,最好在打包阶段执行此操作。此外,创建的 jar 文件通常会自动附加到您的工件,并将传输到远程存储库(在您的情况下为 Nexus)。如果您只是尝试执行 mvn install 并查看输出(如果创建的 jar 已安装到本地存储库),则可以检查这一点。 要将结果部署到 nexus 中,您需要调用 mvn deploy。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 2019-09-03
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        相关资源
        最近更新 更多