19

我可以通过在我的和运行jar中使用以下内容来部署:pom.xmlmvn 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 存储库。我真的不知道这是通过新插件还是通过向现有程序集插件添加目标或其他步骤来完成的。

4

5 回答 5

8

如果您将程序集绑定到打包阶段,它将在您进行构建时安装在您的存储库中“常规”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 上传到您的存储库。

于 2017-07-27T11:23:31.350 回答
5

为了构建(所谓的)Ü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 和可能的其他东西)。但是,我不确定单个插件的预期目标是什么。

于 2012-12-13T18:42:03.303 回答
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>
于 2012-12-13T18:26:45.540 回答
0

pom.xml从本质上讲,我这样做的困难揭示了我已经偏离轨道的事实。一切都会自行到位。我以前在做:

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

我认为在此过程中这种方式是有道理的有几个原因,尤其是当我的库没有很好地从我的应用程序中考虑时。

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

于 2012-12-13T19:15:28.940 回答
0

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

于 2012-12-14T08:09:53.830 回答