Maven部署jar,依赖于repo

时间:2012-12-13 17:29:56

标签: java maven deployment

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

    <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仓库。我真的不知道这是通过新插件还是通过向现有程序集插件添加目标或其他步骤来实现的。

5 个答案:

答案 0 :(得分:6)

如果将程序集绑定到打包阶段,那么当您执行构建时,它将在您的存储库中安装“常规”jar和with-dependencies 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即可将两个罐子上传到您的仓库

答案 1 :(得分:4)

为了构建(所谓的)ÜberJAR并使用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之外,您还可以将ÜberJAR作为一个部署。然后,JAR的用户可以决定根据分类器提取一体化软件包或具有依赖关系的JAR。

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

答案 2 :(得分: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>

答案 3 :(得分:0)

基本上我这样做的困难揭示了我的pom.xml已经脱离轨道的事实。一切都会自行攫取。我以前做过:

  • 将所有依赖项保存到lib文件夹
  • 使用类路径构建一个包含lib文件夹
  • 的jar
  • 使用程序集插件制作另一个可部署的jar

我认为这样做有几个原因,特别是在我的应用程序没有很好地考虑我的库时。

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

答案 4 :(得分:0)

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