当前位置:  开发笔记 > 编程语言 > 正文

使用Maven在jar中包含依赖项

如何解决《使用Maven在jar中包含依赖项》经验,为你挑选了8个好方法。

有没有办法强制maven(2.0.9)在一个jar文件中包含所有依赖项?

我将一个项目构建到一个jar文件中.我希望将依赖项中的类复制到jar中.

更新:我知道我不能在jar文件中包含一个jar文件.我正在寻找一种方法来解压缩指定为依赖项的jar,并将类文件打包到我的jar中.



1> John Stauffe..:

您可以使用带有"jar-with-dependencies"描述符的maven-assembly插件来完成此操作.这是我们的一个pom.xml中的相关块,它执行此操作:

  
    
      
      
        maven-assembly-plugin
        
          
            package
            
              single
            
          
        
        
          
            jar-with-dependencies
          
        
      
    
  


如果任何新的mvn人像我一样陷入困境,请将插件添加到里面的里面的.
"附加"目标已弃用.应该首选"single"或"directory-single"目标.
`directory-single`现在也已弃用.
在官方[网站]上推荐使用_single_(http://maven.apache.org/plugins/maven-assembly-plugin/)
@ Christian.tucker目标目录中有第二个jar,如下所示:**./ target/example-0.0.1-SNAPSHOT.jar**和**./ target/example-0.0.1-SNAPSHOT-jar-与-dependencies.jar**
如何避免在代码中包含未使用的库?我的仅使用SSJ的jar总计10 MB :(
@DA为什么人们忽略了类似的相关(阅读:相关)细节,这超出了我的范围。
只需在配置中添加一件事。您的主要课程信息。<archive> <manifest> <mainClass>完全限定的名称</ mainClass> </ manifest> </ archive>
它工作,但我在目标目录中看到两个JAR:有和没有依赖.如何仅生成具有依赖项的JAR?

2> Pascal Thive..:

使用Maven 2,正确的方法是使用Maven2 Assembly Plugin,它具有用于此目的的预定义描述符文件,您可以在命令行上使用:

mvn assembly:assembly -DdescriptorId=jar-with-dependencies

如果你想让这个jar可执行,只需添加要运行的主类到插件配置:


  org.apache.maven.plugins
  maven-assembly-plugin
  
    
      
        my.package.to.my.MainClass
      
    
  

如果要将该程序集创建为正常构建过程的一部分,则应将单个或目录单个目标(assembly目标应仅从命令行运行)绑定到生命周期阶段(package有意义),如下所示:


  org.apache.maven.plugins
  maven-assembly-plugin
  
    
      create-my-bundle
      package
      
        single
      
      
        
          jar-with-dependencies
        
        ...
      
    
  

调整configuration元素以满足您的需求(例如,使用清单说明的东西).


它对我有用,但有一个任务.在构建之后,现在创建了两个罐子,其中一个是项目artifactid-version,另一个是artifactid-version-"jar-with-dependencies".但我想只建一个罐子.还有别的办法吗?

3> abdiel..:

如果你想做一个可执行的jar文件,他们也需要设置主类.所以完整的配置应该是.

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


为什么jar的名称后面加上“ jar-with-dependencies”?任何解决方法?

4> Thomas Jung..:

有阴影maven插件.它可用于打包和重命名依赖项(以省略类路径上的依赖性问题).


如果您不喜欢jar-with-dependencies作为文件名的一部分。

5> lasantha..:

您可以使用标记来使用新创建的jar .


    
        your.group.id
        your.artifact.id
        1.0
        jar
        jar-with-dependencies
    



6> Rop..:

如果你(像我一样)不喜欢上面描述的jar-with-dependencies方法,我更喜欢的maven-solution是简单地构建一个WAR项目,即使它只是你正在构建的一个独立的java应用程序:

    制作一个普通的maven jar项目,它将构建你的jar文件(没有依赖项).

    另外,设置一个maven war-project(只有一个空的src/main/webapp/WEB-INF/web.xml文件,这将避免maven-build中的警告/错误),只有你的jar项目一个依赖项,并使你的jar项目成为你的战争项目.(这个war-project只是将所有jar文件依赖项包装到zip文件中的简单技巧.)

    构建war-project以生成war文件.

    在部署步骤中,只需将.war文件重命名为*.zip并解压缩即可.

您现在应该有一个lib-directory(可以将它移动到您想要的位置)与您的jar以及运行应用程序所需的所有依赖项:

java -cp 'path/lib/*' MainClass

(classpath中的通配符适用于Java-6或更高版本)

我认为这在maven中设置更简单(不需要使用程序集插件)并且还可以让您更清楚地了解应用程序结构(您将在普通视图中看到所有相关jar的版本号,以及避免将所有内容堵塞到一个jar文件中).



7> André Valent..:

http://fiji.sc/Uber-JAR提供了对替代方案的出色解释:

构建uber-JAR有三种常用方法:

    无阴影.解压缩所有JAR文件,然后将它们重新打包到单个JAR中.

    Pro:使用Java的默认类加载器.

    Con:具有相同路径的多个JAR文件中存在的文件(例如,META-INF/services/javax.script.ScriptEngineFactory)将相互覆盖,从而导致错误行为.

    工具:Maven Assembly Plugin,Classworlds Uberjar

    阴影.与无阴影相同,但重命名(即"阴影")所有依赖项的所有包.

    Pro:使用Java的默认类加载器.避免一些(不是全部)依赖版本冲突.

    Con:具有相同路径的多个JAR文件中存在的文件(例如,META-INF/services/javax.script.ScriptEngineFactory)将相互覆盖,从而导致错误行为.

    工具:Maven Shade插件

    JAR的JAR.最终的JAR文件包含嵌入的其他JAR文件.

    专业版:避免依赖版本冲突.保留所有资源文件.

    Con:需要捆绑一个特殊的"bootstrap"类加载器,以使Java能够从包装的JAR文件中加载类.调试类加载器问题变得更加复杂.

    工具:Eclipse JAR文件导出器,One-JAR.



8> 小智..:
        
        
        
            org.apache.maven.plugins
            maven-dependency-plugin
            
                ${project.build.directory}/lib
                false 
                false
            
            
                
                    copy-dependencies
                    package
                    
                        copy-dependencies
                    
                
            
        
        
        
            org.apache.maven.plugins
            maven-jar-plugin
            2.4
            
                
                    
                        true
                        lib/
                    
                
            
        


        
        
        
            maven-assembly-plugin
            
              
                package
                
                  single
                
              
            
            
              
                jar-with-dependencies
              
            
                    

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有