首页 文章

只在Maven中创建可执行的jar-with-dependencies

提问于
浏览
25

在我的 pom.xml 中,我使用maven-assembly-plugin在运行"mvn clean install"时创建一个可执行的jar-with-dependencies . 现在它首先创建非可执行文件"name-version.jar",之后创建"name-version-jar-with-dependencies.jar" .

我可以以某种方式配置 pom.xml ,以便它不会创建不可执行的JAR文件吗?

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

此外,我得到了几个“...已添加,跳过”消息 . 我可以以某种方式阻止他们吗?

这是我的 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>

5 回答

  • 1

    我想我已经弄清楚如何做到这一点 . 您必须离开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匹配 . 另请注意 <appendAssemblyId>false</appendAssemblyId> . 如果这样做,构建和程序集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
    
  • 0

    我使用maven-jar-plugin和像这样的maven-assembly-plugin的单一目标来使用它

    <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>
    
  • 4

    你可以尝试设置为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>
    
  • 0

    也许我错过了一些关于你的问题,但下面的代码让我成为一个可执行的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>
    
  • 3

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

    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>
    

相关问题