Maven 2程序集插件破坏了一些META-INF文件

时间:2009-06-09 16:33:03

标签: java spring maven-2

我正在使用Maven 2程序集插件来构建jar-with-dependencies并创建一个可执行的JAR文件。我的程序集包括Spring和CXF库。

CXF包含META-INF文件的副本spring.schemas和spring.handlers,最终破坏了spring-2.5.4 jar中的类似文件。

手动,我可以在jar-with-dependencies中更新这两个文件。

我正在寻找的是Maven POM中的一些方法来指导程序集插件以获取这两个文件的正确版本。

程序集插件文档讨论了文件过滤,但似乎没有配置或参数,没有遇到创建自定义程序集描述符的麻烦。

在这种情况下,制作自定义汇编描述符是我唯一的希望吗?

6 个答案:

答案 0 :(得分:7)

出于某种原因,Mojo和其他人建议的解决方案仍然不适合我。我创建了自定义spring.handlersspring.schemas个文件,并将它们放在src/main/resources/META-INF下。但是,使用unpackOptions时,我的文件也不包括在内。当我不使用unpackOptions时,我的文件不是jar中的文件。

我最终做的是直接引用文件。这最终将我的文件放入JAR。

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <!-- TODO: a jarjar format would be better -->
    <id>jar-with-dependencies</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <unpack>true</unpack>
            <unpackOptions>
                <excludes>
                    <exclude>META-INF/spring.handlers</exclude>
                    <exclude>META-INF/spring.schemas</exclude>
                </excludes>
            </unpackOptions>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
    <files>
        <file>
            <source>${project.basedir}/src/main/resources/META-INF/spring.handlers</source>
            <outputDirectory>META-INF</outputDirectory>
        </file>
        <file>
            <source>${project.basedir}/src/main/resources/META-INF/spring.schemas</source>
            <outputDirectory>META-INF</outputDirectory>
        </file>
    </files>
</assembly>

答案 1 :(得分:5)

我建议使用maven-shade-plugin代替。如果你查看cxf-bundle(http://svn.apache.org/repos/asf/cxf/trunk/distribution/bundle/all/pom.xml)的pom,你可以看到如何使用阴影变换器合并spring.schemas和其他必要的文件。

答案 2 :(得分:5)

我尝试了阴影插件方法,它工作得非常好。以下是您需要放入POM的所有内容(无需组装插件)。

      <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.ManifestResourceTransformer">
                                <mainClass>org.example.Runner</mainClass>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>

答案 3 :(得分:1)

我已经解决了,这里有详细信息:

首先,如果使用内置程序集描述符jar-with-dependencies,则无法指定文件包含或排除。

程序集插件文档提供了示例jar-with-dependencies descriptor here

我将该描述符复制并粘贴到项目目录中名为exec-jar.xml的文件中。然后在pom中,我更改了程序集插件以引用该描述符。这是摘录:

<build>
  <plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2-beta-3</version>
        <configuration>
            <descriptors>
                <descriptor>exec-jar.xml</descriptor>
            </descriptors>
            <archive>
                <manifest>
                    <mainClass>com.package.MyMainClass</mainClass>
                </manifest>
            </archive>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
  </plugins>
</build>

该位描述符将程序集绑定到生命周期的包阶段,并引用exec-jar.xml描述符。执行该程序包确认jar的构建方式与预定义描述符一样。

因此,修改exec-jar.xml以排除与Spring文件冲突的CXF文件成为问题。这是我的汇编描述符,完成了:

<assembly>
  <id>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <unpackOptions>
        <excludes>
            <exclude>cxf*/META-INF/spring.handlers</exclude>
            <exclude>cxf*/META-INF/spring.schemas</exclude>
        </excludes>
      </unpackOptions>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
    </fileSet>
  </fileSets>
</assembly>

现在,这就是问题。如果使用当前发布的程序集插件2.1版执行此操作,它将在标记上失败为“意外”。插件的未发布版本2.2支持该标记。请注意,在我上面的pom文件摘录中,我指定了maven-assembly-plugin版本2.2-beta-3,这是撰写本文时的最新版本。

这成功构建了一个可执行jar,Spring拥有初始化我的app所需的所有处理程序和模式。

答案 4 :(得分:1)

您还可以通过从所需的spring发行版中获取spring.schemas和spring.handlers文件来解决此问题,并将它们放在项目src / main / resources / META-INF目录中。由于这些是最后打包的,您将获得所需的版本。我发现了这个想法here

答案 5 :(得分:0)

如果你从Mojo的回答中得到配置错误:

错误:发生了JNI错误,请检查您的安装并重试 线程“main”中的异常java.lang.SecurityException:Manifest主要属性的签名文件摘要无效

对我来说,以下工作:http://zhentao-li.blogspot.de/2012/06/maven-shade-plugin-invalid-signature.html

  <filters>
    <filter>
      <artifact>*:*</artifact>
      <excludes>
        <exclude>META-INF/*.SF</exclude>
        <exclude>META-INF/*.DSA</exclude>
        <exclude>META-INF/*.RSA</exclude>
      </excludes>
    </filter>
  </filters>