【问题标题】:Only create executable jar-with-dependencies in Maven仅在 Maven 中创建可执行的 jar-with-dependencies
【发布时间】:2011-06-28 08:06:30
【问题描述】:

在我的pom.xml 中,我在运行“mvn clean install”时使用 maven-assembly-plugin 创建一个可执行的 jar-with-dependencies。 现在它首先创建不可执行的“name-version.jar”,然后创建“name-version-jar-with-dependencies.jar”。

我能否以某种方式配置pom.xml,使其不会创建不可执行的 JAR 文件?

目前我使用 false 所以它只是覆盖了第一个文件...

我还收到几条“...已经添加,正在跳过”的消息。我能以某种方式阻止它们吗?

这是我 pom.xml 中的 maven-assembly-plugin 定义:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <archive>
            <manifest>
                <mainClass>my.main.class</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

【问题讨论】:

  • 更改或删除描述符 jar-with-dependencies。此外,将程序集插件更新到 2.2 版本而不是 2.2-...
  • 好的,我更新了版本。但是当我删除descriptorRef时,消息来了:“读取程序集时出错:找不到程序集描述符。”

标签: maven jar


【解决方案1】:

也许我错过了有关您的问题的一些信息,但以下代码使我成为一个可执行的 jar:这是您要查找的内容吗?

              <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <version>2.3.1</version>
              <configuration>
                    <archive>
                          <manifest>
                              <addClasspath>true</addClasspath>
                                <mainClass>some.main.class</mainClass>
                          </manifest>
                    </archive>
                    <finalName>Proj-${project.version}</finalName>
                    <outputDirectory>target</outputDirectory>
              </configuration>
        </plugin>

【讨论】:

  • 是的,您错过了或者我没有明确提及,我需要该可执行 jar 中的依赖项。这就是为什么我将 maven-assembly-plugin 与 jar-with-dependencies 设置一起使用。
【解决方案2】:

您可以尝试设置为 pom.这将阻止default jar 的创建。

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <packaging>pom</packaging>
  ...
</project>

【讨论】:

  • 这会将类文件添加到最终(包含所有依赖项的jar)jar中吗?
【解决方案3】:

我想我已经知道如何做到这一点了。您必须保留 jar,否则您将丢失编译器和资源复制,以及与构建所需的 jar 相关的所有其他内容。

我的解决方案基本上涉及欺骗 maven,所以我想要提防的是,在未来的版本中,这很可能不起作用......

<build>
    <defaultGoal>install</defaultGoal>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>dumpster-diver</finalName>
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>DumpsterDiver</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <finalName>${project.artifactId}</finalName>
</build>

请注意,在列出的构建配置中,maven-assembly-plugin 和构建本身的 finalName 匹配。另请注意&lt;appendAssemblyId&gt;false&lt;/appendAssemblyId&gt;。如果这样做,构建和程序集 jar 的输出文件名将完全匹配。 Maven 肯定会对此发出警告,但会将您想要的 jar 放在目标目录和本地存储库中。

这里是这个项目的 'mvn clean install' 的输出,以及目标目录和本地存储库中的 jar 的 jar -tvf:

$ mvn clean install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building dumpster-diver
[INFO]    task-segment: [clean, install]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting directory <currentDirectory>/target
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to <currentDirectory>/target/classes
[INFO] [resources:testResources {execution: default-testResources}]
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory <currentDirectory>/src/test/resources
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] No sources to compile
[INFO] [surefire:test {execution: default-test}]
[INFO] No tests to run.
[INFO] [jar:jar {execution: default-jar}]
[INFO] Building jar: <currentDirectory>/target/dumpster-diver.jar
[INFO] [assembly:single {execution: default}]
[INFO] Processing DependencySet (output=)
[WARNING] Artifact: <groupId>:dumpster-diver:jar:0.1.0-SNAPSHOT references the same file as the assembly destination file. Moving it to a temporary location for inclusion.
[INFO] Building jar: <currentDirectory>/target/dumpster-diver.jar
[WARNING] Configuration options: 'appendAssemblyId' is set to false, and 'classifier' is missing.
Instead of attaching the assembly file: <currentDirectory>/target/dumpster-diver.jar, it will become the file for main project artifact.
NOTE: If multiple descriptors or descriptor-formats are provided for this project, the value of this file will be non-deterministic!
[WARNING] Replacing pre-existing project main-artifact file: <currentDirectory>/target/archive-tmp/dumpster-diver.jar
with assembly file: <currentDirectory>/target/dumpster-diver.jar
[INFO] [install:install {execution: default-install}]
[INFO] Installing <currentDirectory>/target/dumpster-diver.jar to /opt/m2repo/<groupId>/dumpster-diver/0.1.0-SNAPSHOT/dumpster-diver-0.1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Thu Aug 18 13:08:56 EDT 2011
[INFO] Final Memory: 22M/618M
[INFO] ------------------------------------------------------------------------
krohr@krohr-Latitude-E6500:<currentDirectory>
$ jar -tvf ./target/dumpster-diver.jar | grep -i "dump"
  6831 Thu Aug 18 13:08:54 EDT 2011 DumpsterDiver.class
  6831 Thu Aug 18 13:08:54 EDT 2011 DumpsterDiver.class
     0 Thu Aug 18 13:08:56 EDT 2011 META-INF/maven/<groupId>/dumpster-diver/
  2580 Thu Aug 18 13:01:46 EDT 2011 META-INF/maven/<groupId>/dumpster-diver/pom.xml
       126 Thu Aug 18 13:08:54 EDT 2011 META-INF/maven/<groupId>/dumpster-diver/pom.properties
krohr@krohr-Latitude-E6500:<currentDirectory>
$ jar -tvf /opt/m2repo/<groupId>/dumpster-diver/0.1.0-SNAPSHOT/dumpster-diver-0.1.0-SNAPSHOT.jar | grep -i "dump"
  6831 Thu Aug 18 13:08:54 EDT 2011 DumpsterDiver.class
  6831 Thu Aug 18 13:08:54 EDT 2011 DumpsterDiver.class
     0 Thu Aug 18 13:08:56 EDT 2011 META-INF/maven/<groupId>/dumpster-diver/
  2580 Thu Aug 18 13:01:46 EDT 2011 META-INF/maven/<groupId>/dumpster-diver/pom.xml
   126 Thu Aug 18 13:08:54 EDT 2011 META-INF/maven/<groupId>/dumpster-diver/pom.properties

【讨论】:

  • 您有没有找到消除警告的方法?
【解决方案4】:

您可以使用下面的构建并使用以下命令进行编译:

mvn clean compile assembly:single

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>youMainClass</mainClass>
                        </manifest>
                    </archive>

                    <finalName>${artifactId}</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
        </plugin>
    </plugins>
</build>

【讨论】:

    【解决方案5】:

    我使用 maven-jar-plugin 和 maven-assembly-plugin 的 single 目标让它工作,就像这样

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
                <configuration>
                    <finalName>finalName</finalName>
                    <archive>
                        <manifest>
                            <mainClass>
                                mainClass
                            </mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    无论如何最重要的是告诉maven不要使用maven-jar-plugin的这个配置生成默认jar

    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <executions>
            <execution>
                <id>default-jar</id>
                <phase>none</phase>
            </execution>
        </executions>
    </plugin>
    

    【讨论】:

    【解决方案6】:

    如果有帮助,我可以按如下方式解决此问题,它消除了所有警告并将 uber jar 替换为与原始输出 jar 相同的位置,更像是 spring boot uber jar 插件在没有 spring 的情况下所做的启动依赖项。

    关键方面:

    • appendAssemblyId = true
    • 附加 = 假
    • antrun 重命名文件
    • 插件执行顺序由POM文件中的顺序定义
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <appendAssemblyId>true</appendAssemblyId>
            <attach>false</attach>
            <archive>
              <manifest>
                <mainClass>foo.bar.Baz</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <artifactId>maven-antrun-plugin</artifactId>
      <executions>
        <execution>
          <id>rename-jar-with-dependencies</id>
          <phase>package</phase>
          <goals>
            <goal>run</goal>
          </goals>
          <configuration>
            <target>
              <move file="${project.build.directory}/${project.build.finalName}.jar"
                tofile="${project.build.directory}/${project.build.finalName}.jar.original" />
              <move file="${project.build.directory}/${project.build.finalName}-jar-with-dependencies.jar"
                tofile="${project.build.directory}/${project.build.finalName}.jar" />
            </target>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    【讨论】:

    • 谢谢你,正是我想要的!这对我帮助很大!
    猜你喜欢
    • 2012-01-31
    • 2011-08-06
    • 2011-07-13
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多