如何使用 Maven 创建具有依赖关系的可执行 JAR?

问:

我想将我的项目打包在一个可执行的 JAR 中以进行分发。

如何使 Maven 项目将所有依赖项 JAR 打包到我的输出 JAR 中?

答1:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!


  
    
      maven-assembly-plugin
      
        
          
            fully.qualified.MainClass
          
        
        
          jar-with-dependencies
        
      
    
  


你运行它

mvn clean compile assembly:single

编译目标应该在 assembly:single 之前添加,否则不包括您自己项目中的代码。

在评论中查看更多详细信息。

通常,此目标与自动执行的构建阶段相关联。这可确保在执行 mvn install 或执行部署/发布时构建 JAR。


  
    
      maven-assembly-plugin
      
        
          
            fully.qualified.MainClass
          
        
        
          jar-with-dependencies
        
      
      
        
          make-assembly 
          package 
          
            single
          
        
      
    
  


谢谢@IAdapter。请注意,您应该始终事先进行编译,因为它只会将“目标/类”中的任何内容放入 JAR 中。这将确保 JAR 包含您最近对源代码所做的任何更改。因此,您应该执行以下操作:mvn clean compile assembly:single。

我看到这不会将 jar 添加到 uber jar 中,而是将所有类文件添加到 jar 中。

提示:您还可以将元素 false 添加到 configuration 以避免名称中烦人的“-jar-with-dependencies”后缀

如果我没有 main 方法或类,我只需要一些随机的 java 文件作为 jar 怎么办?

@user10201743 只是提供一点上下文:Maven 中的 Everything 是一个插件。编译器? maven-compiler-plugin。测试? maven-surefire-plugin。这两个,包括程序集,是官方的 maven 插件,所以它们也可以被视为 maven 的一部分(尤其是因为,至少现在,它们三个都默认在你的有效 POM 中)。

答2:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

您可以在打包阶段之前使用依赖插件在单独的目录中生成所有依赖项,然后将其包含在清单的类路径中:


    org.apache.maven.plugins
    maven-dependency-plugin
    
        
            copy-dependencies
            prepare-package
            
                copy-dependencies
            
            
                ${project.build.directory}/lib
                false
                false
                true
            
        
    


    org.apache.maven.plugins
    maven-jar-plugin
    
        
            
                true
                lib/
                theMainClass
            
        
    


或者,使用 ${project.build.directory}/classes/lib 作为 OutputDirectory 将所有 jar 文件集成到主 jar 中,但是您需要添加自定义类加载代码来加载 jar。

有没有办法在不编写自定义类加载器的情况下使用此方法?我收到“ClassNotFoundException”。当我比较程序集插件时,我想我可以使用 maven-dependency-plugin 解包依赖项。有什么建议吗?

答3:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

请参阅 executable-jar-with-maven-example (GitHub)

笔记

Stephan 提供了这些优点和缺点。

对于手动部署

优点

缺点 依赖项不在最终的 jar 中。

依赖项不在最终的 jar 中。

将依赖项复制到特定目录


  org.apache.maven.plugins
  maven-dependency-plugin
  
    
      copy-dependencies
      prepare-package
      
        copy-dependencies
      
      
        ${project.build.directory}/${project.build.finalName}.lib
      
    
  


使 Jar 可执行且可感知类路径


  org.apache.maven.plugins
  maven-jar-plugin
  
    
      
        true
        ${project.build.finalName}.lib/
        ${fully.qualified.main.class}
      
    
  


此时,jar 实际上可以使用外部类路径元素执行。

$ java -jar target/${project.build.finalName}.jar

制作可部署的档案

jar 文件只能与同级 …lib/ 目录一起执行。我们需要制作档案以与目录及其内容一起部署。


  org.apache.maven.plugins
  maven-antrun-plugin
  
    
      antrun-archive
      package
      
        run
      
      
        
          
          
          
          
          
          
          
        
      
    
  


现在您有了 target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz),每个都包含 jar 和 lib/*。

Apache Maven 程序集插件

优点

缺点 不支持类重定位(如果需要类重定位,请使用 maven-shade-plugin)。

没有类重定位支持(如果需要类重定位,请使用 maven-shade-plugin)。


  org.apache.maven.plugins
  maven-assembly-plugin
  
    
      package
      
        single
      
      
        
          
            ${fully.qualified.main.class}
          
        
        
          jar-with-dependencies
        
      
    
  


您有 target/${project.bulid.finalName}-jar-with-dependencies.jar。

Apache Maven 阴影插件

优点

缺点


  org.apache.maven.plugins
  maven-shade-plugin
  
    
      
        shade
      
      
        true
        
          
            ${fully.qualified.main.class}
          
        
      
    
  


您有 target/${project.build.finalName}-shaded.jar。

onejar-maven-插件

优点

缺点 自 2012 年以来未得到积极支持。

自 2012 年以来未得到积极支持。


   
  com.jolira
  onejar-maven-plugin
  
    
      
        ${fully.qualified.main.class}
        true
        
        
        ${project.build.finalName}-onejar.${project.packaging}
      
      
        one-jar
      
    
  


Spring Boot Maven 插件

优点

缺点 添加潜在的不必要的 Spring 和 Spring Boot 相关类。

添加潜在的不必要的 Spring 和 Spring Boot 相关类。


  org.springframework.boot
  spring-boot-maven-plugin
  
    
      
        repackage
      
      
        spring-boot
        ${fully.qualified.main.class}
      
    
  


您有 target/${project.bulid.finalName}-spring-boot.jar。

答4:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

接受未回答的答案并重新格式化,我们有:


    
        
            org.apache.maven.plugins
            maven-jar-plugin
            
                
                    
                        true
                        fully.qualified.MainClass
                    
                
            
        
        
            maven-assembly-plugin
            
                
                    jar-with-dependencies
                
            
        
    


接下来,我建议将其作为构建的自然部分,而不是显式调用。要使其成为您构建的一个组成部分,请将此插件添加到您的 pom.xml 并将其绑定到 package 生命周期事件。但是,一个问题是,如果将它放在 pom.xml 中,则需要调用 assembly:single 目标,而如果从命令行手动执行,则需要调用“assembly:assembly”。


  [...]
  
      
          
              maven-assembly-plugin
              
                  
                      
                          true
                          fully.qualified.MainClass
                      
                  
                  
                      jar-with-dependencies
                  
              
              
                  
                      make-my-jar-with-dependencies
                      package
                      
                          single
                      
                  
              
          
      [...]
      
    [...]
  


答5:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

使用 maven-shade-plugin 将所有依赖项打包到一个 uber-jar 中。也可以通过指定主类来构建可执行jar。在尝试使用 maven-assembly 和 maven-jar 之后,我发现这个插件最适合我的需要。

我发现这个插件特别有用,因为它合并了特定文件的内容而不是覆盖它们。当 jar 中存在同名的资源文件并且插件尝试打包所有资源文件时,需要这样做

请参阅下面的示例

      
    
        
            org.apache.maven.plugins
            maven-shade-plugin
            1.4
            
                
                    package
                    
                        shade
                    
                    
                        
                        
                            
                                bouncycastle:bcprov-jdk15
                            
                        

                         
                            
                                
                                com.main.MyMainClass
                            
                            
                            
                                properties.properties
                            
                            
                                applicationContext.xml
                            
                            
                                META-INF/cxf/cxf.extension
                            
                            
                                META-INF/cxf/bus-extensions.xml
                            
                     
                    
                
            
        

    

答6:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

您可以使用 maven-shade 插件来构建一个 uber jar,如下所示


    org.apache.maven.plugins
    maven-shade-plugin
    
        
            package
            
                shade
            
        
    


答7:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

长期使用 maven 程序集插件,但我找不到解决 “already added, skipping” 问题的方法。现在,我正在使用另一个插件 - onejar-maven-plugin。下面的示例(mvn package 构建 jar):


    org.dstovall
    onejar-maven-plugin
    1.3.0
    
        
            
                com.company.MainClass
            
            
                one-jar
            
        
    


您需要为该插件添加存储库:


    
        onejar-maven-plugin.googlecode.com
        http://onejar-maven-plugin.googlecode.com/svn/mavenrepo
    


答8:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

您可以使用 maven-dependency-plugin,但问题是如何创建可执行 JAR。为此,需要对 Matthew Franglen 的响应进行以下更改(顺便说一句,从干净的目标开始时使用依赖插件需要更长的时间来构建):


    
        
            maven-jar-plugin
            
                
                    
                        fully.qualified.MainClass
                    
                
            
        
        
            maven-dependency-plugin
            
                
                    unpack-dependencies
                    package
                    
                        unpack-dependencies
                    
                
            
        
    
    
        
            ${basedir}/target/dependency
        
    


答9:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

您可以将以下内容添加到您的 pom.xml:


install

  
    maven-compiler-plugin
    2.3.2
    
      1.6
      1.6
    
  
  
    org.apache.maven.plugins
    maven-jar-plugin
    2.3.1
    
      
        
          true
          com.mycompany.package.MainClass
        
      
    
  
  
    maven-assembly-plugin
    
      
        jar-with-dependencies
      
      
        
          com.mycompany.package.MainClass
        
      
    
    
      
        make-my-jar-with-dependencies
        package
        
          single
        
      
    
  



之后,您必须通过控制台切换到 pom.xml 所在的目录。然后你必须执行 mvn assembly:single 然后你的可执行 JAR 文件与依赖项将有望被构建。您可以在使用 cd ./target 切换到输出(目标)目录并使用类似于 java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar 的命令启动 jar 时检查它。

我用 Apache Maven 3.0.3 对此进行了测试。

答10:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

如果您真的想将其他 JAR 内容重新打包到您的单个结果 JAR 中,另一个选项是 Maven Assembly plugin。它解压缩然后通过 true 将所有内容重新打包到一个目录中。然后你会有第二遍将它构建到一个巨大的 JAR 中。

Another option is the OneJar plugin。这一步完成了上述重新打包操作。

答11:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

我浏览了这些响应中的每一个,希望制作一个包含所有依赖项的胖可执行 jar,但它们都不能正常工作。答案是阴影插件,它非常简单明了。

    
      org.apache.maven.plugins
      maven-shade-plugin
      2.3
      
         
        
        package
        
            shade
        
        
          
             
                path.to.MainClass
             
          
        
          
      
    

请注意,您的依赖项需要具有编译或运行时范围才能正常工作。

This example came from mkyong.com

原文链接:https://www.huntsbot.com/qa/maXr/how-can-i-create-an-executable-jar-with-dependencies-using-maven?lang=zh_CN&from=csdn

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值