如何使用库编译Maven Java项目?

12 浏览
0 Comments

如何使用库编译Maven Java项目?

我有一个代码库,我想将其分发为jar文件。它还依赖于外部的jar文件,我希望将它们捆绑在最终的jar文件中。\n我听说可以使用maven-assembly-plug-in来实现这一点,但我不太理解如何操作。有人能给我一些示例吗?\n目前,我正在使用fat jar来捆绑最终的jar文件。我希望能够使用maven来实现相同的功能。

0
0 Comments

问题的出现原因:

可能的原因是想使用maven-shade-plugin插件来打包依赖项,减少未使用的代码并隐藏外部依赖项,以避免冲突。

解决方法:

可以使用以下配置在pom.xml文件中添加maven-shade-plugin插件:


    
        
            org.apache.maven.plugins
            maven-shade-plugin
            3.1.1
            
                
                    package
                    
                        shade
                    
                    
                        true
                        true
                        
                            ${java.io.tmpdir}/dependency-reduced-pom.xml
                        
                        
                            
                                com.acme.coyote
                                hidden.coyote
                            
                        
                    
                
            
        
    

参考资料:

- [http://maven.apache.org/plugins/maven-shade-plugin/plugin-info.html](http://maven.apache.org/plugins/maven-shade-plugin/plugin-info.html)

- [http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html](http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html)

如果遇到"Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found"错误,只需移除`true`。

如果出现"java.lang.SecurityException: Invalid signature file digest for Manifest main attributes"异常,则可以在上述配置部分添加以下内容来解决:

[stackoverflow.com/a/6743609/38368](https://stackoverflow.com/a/6743609/38368)

作者在寻找一种将jackson-dataformat-xml的依赖项与新生成的jar文件合并到一个大的jar文件中的方法。希望maven-shade-plugin插件能够提供帮助。问题是:这种方法是否合理?将这些依赖项合并到一个jar文件中是否是简化部署的好方法?

0
0 Comments

使用maven-shade-plugin插件可以解决如何将Maven Java编译成带有库的问题。配置好shade插件后,在构建过程中运行mvn package命令将创建一个包含所有依赖项的单个jar文件。这是现在正确的做法。maven-assembly-plugin文档中指出:“如果项目想要将构件打包成uber-jar,则assembly插件仅提供基本支持。要获得更多控制权,请使用Maven Shade Plugin。”但是,如何将这个单独的.jar文件用于发布呢?

我不同意这是现在“正确”的做法。如果您只需要基本行为,那么绝对可以继续使用assembly插件。shade插件可以执行高级操作,如重写字节码以修改依赖项的包名称,当您在生产代码中进行这样的操作时,就引入了额外的风险,如果没有充分的理由是不值得的。

你能举个shade插件可能引入的风险的例子吗?谢谢。

不,我不能给出具体的例子。但是,重写字节码是一项非常复杂的任务,容易出现错误。它还违背了在Java中开发的目的之一,因为在开发过程中测试的字节码与生产环境中运行的字节码不同。虽然大多数构建中的错误会导致容易检测到的编译错误或“文件不存在”错误,但在这里,构建实际上是修改了我们编写的内容,任何错误都可能导致难以检测到的奇怪行为。大多数企业级公司不会在没有非常充分的理由的情况下冒这个风险。

0
0 Comments

如何使用Maven编译Java项目并包含依赖库?

如果您是一个Spring Boot应用程序,请阅读答案末尾。

请在您的pom.xml文件中添加以下插件:

最新版本可以在此处找到:https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-assembly-plugin

...

    
        
            org.apache.maven.plugins
            maven-assembly-plugin
            选择最新版本
            
                
                    jar-with-dependencies
                
            
            
                
                    assemble-all
                    package
                    
                        single
                    
                
            
        
    

...

配置完插件后,运行`mvn package`命令将会生成两个JAR文件:一个只包含项目的类文件,另一个是包含所有依赖库的fat jar文件,文件名带有"-jar-with-dependencies"后缀。

如果您希望在运行时正确设置classpath,则还需要添加以下插件:


    org.apache.maven.plugins
    maven-jar-plugin
    
        
            
                true
                完整的主类名
            
        
    

对于Spring Boot应用程序,只需使用以下插件(选择适当的版本):


    org.springframework.boot
    spring-boot-maven-plugin
    
        true
        ${start-class}
    
    
        
            
                repackage
            
        
    

这是现在已经弃用的方法,应改用maven-shade-plugin插件。请参阅答案:stackoverflow.com/a/16222965/274350。

maven-assembly-plugin是否可以减小fat jar的大小?

减小fat jar大小是什么意思?

自动从jar文件中排除无用的依赖项。我看到maven-shadow插件支持此功能。但我使用的是assembly插件,所以想询问一下。

您在哪里看到它已经弃用了?我在这里找不到任何关于此插件已经弃用的信息:maven.apache.org/plugins/maven-assembly-plugin

assembly插件允许手动选择要放入jar文件中的内容。不确定是否支持自动检测。

"弃用"可能是一个错误的词,但是在maven.apache.org/plugins/maven-assembly-plugin的文档中写道:“如果项目要将构件打包为一个超级JAR文件,则assembly插件只提供基本的支持。要获得更多的控制,请使用Maven Shade插件。”

spring-boot-maven-plugin的repackage目标也可以用来简单地打包一个带有嵌套依赖项的JAR文件,其中layout=NONE。这不要求项目使用Spring或Spring Boot。docs.spring.io/spring-boot/docs/current/maven-plugin/reference/…

类似问题:stackoverflow.com/questions/70833195/…

使用maven-assembly-plugin时,需要将archive/manifest部分也添加到插件的配置部分,以便正确设置classpath。这样您就不需要maven-jar-plugin了。完整答案请参见:stackoverflow.com/a/74993923/4311428

0