美文网首页我爱编程
maven-assembly-plugin打包spring项目U

maven-assembly-plugin打包spring项目U

作者: 测试你个头 | 来源:发表于2017-01-20 17:07 被阅读0次

    背景:最近改造一个可执行jar包项目为spring+maven+mybatis框架,在对项目进行package后运行时遇到了报错

    开发环境

    操作系统:mac os x
    IDE:intellij idea
    maven版本:3.3.9

    问题回放

    项目是一个idea的典型多模块项目(有3个模块,其中2个模块我们称之为A和B吧,都是spring的项目,模块A依赖模块B,模块A是最终需要打包的模块),父项目的pom.xml仅做模块依赖管理用
    1.在A模块的pom.xml中添加assembly插件的配置

    <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <version>2.4</version>
         <configuration>
               <descriptorRefs>
                     <descriptorRef>jar-with-dependencies</descriptorRef>
               </descriptorRefs>
         </configuration>
    </plugin>
    

    2.在A模块的目录下运行打包命令:mvn assembly:assembly
    其中的original-xxx.jar是不带依赖模块的jar包,而xxx.jar便是带依赖模块的jar包


    3.通过命令java -jar xxx.jar运行程序,发现错误信息如下:Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]

    这是 assembly 插件的一个 bug:http://jira.codehaus.org/browse/MASSEMBLY-360,它在对第三方打包时,对于 META-INF 下的 spring.handlers,spring.schemas 等多个同名文件进行了覆盖,遗漏掉了一些版本的 xsd 本地映射。

    如何查看打包后的spring.handlers,spring.schemas文件?
    将打包后的jar包解压(如果不能解压,改后缀名为zip),在解压后的目录里面找到META-INF目录,下面就有这几个spring的文件:


    当对模块A进行打包时,由于依赖B,且2个模块都是基于spring框架,各自有独立的spring相关配置文件,在使用assembly插件进行打包时,这些配置文件会相互覆盖掉

    解决方法

    更换为maven-shade-plugin插件来进行打包:
    模块A的pom.xml配置如下:

                <!--shade plugins-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>1.4</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <transformers>
                                    <transformer
                                            implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                        <resource>META-INF/spring.handlers</resource>
                                    </transformer>
                                    <transformer
                                            implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                        <resource>META-INF/spring.schemas</resource>
                                    </transformer>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    

    相关文章

      网友评论

        本文标题:maven-assembly-plugin打包spring项目U

        本文链接:https://www.haomeiwen.com/subject/tdzwbttx.html