Maven构建时JAR文件损坏

30

在构建war文件时,我会将一组jar从一个位置复制到war内部的一个文件夹中。尽管文件确实被复制了,但是我认为它们被损坏了,因为当从war文件中取出相同的jar类文件并尝试用调试器打开时,无法打开。

以下是我在war的pom.xml中复制jar的部分:

<execution> 
    <id>copy-jars</id> 
    <phase>process-resources</phase> 
    <goals> 
        <goal>copy-resources</goal> 
    </goals> 
    <configuration> 
        <outputDirectory>${basedir}/target/${project.artifactId}-${buildNumber}/somefolder</outputDirectory> 
         <resources> 
            <resource> 
                <directory>SomeSourceDirectory</directory> 
                <filtering>true</filtering> 
                <includes> 
                    <include>**/**</include> 
                </includes>
            </resource>
        </resources> 
    </configuration> 
</execution>

SomeSourceDirectory里有一些jar包和其他文件。 结果是: myWar/somefolder/a.jar,但是当我在调试器中打开这个jar包中的类时,WinZip会报错。

Invalid compressed data to extract.
Severe Error:  Compressed data is invalid

然而,当我在war文件之外的原始文件夹中查看同一个类文件时,它是可以查看的。所以,复制jar包时是否出现了错误?谢谢。


这些 JAR 文件是否相同?文件大小相同,可能的话 MD5 校验和也相同... - cha0site
文件大小相同,但MD5校验和似乎不同.. 我使用了从http://activityworkshop.net/software/md5/index.html下载的md5.jar进行了检查.. 不知道为什么会出现不同的校验和? - pranay
5个回答

68

删除<filtering>true</filtering>,它会破坏JAR文件。


太好了!非常感谢Emmanuel,它起作用了 :) 但仍然想知道为什么Maven有这种奇怪的行为?过滤有什么用处呢? - pranay
7
过滤功能在复制包含对项目版本的引用的文本资源时非常有用。但是,如果应用于二进制文件,则会破坏内容。 - Emmanuel Bourg
1
使用汇编插件时,请注意此设置可能不在pom.xml文件中,而是在相关的描述符xml文件中。 - tobijdc
重要提示:maven-resources-plugin 的默认过滤选项似乎是“true”,因此我需要明确将过滤设置为“false”,而不仅仅是删除该行。 - pooshla

16

此外,你可以继续使用maven filtering功能而不破坏jar包。

我们选择排除过滤扩展名的jar包。

在父pom的pluginManagement部分中,我们添加了以下配置

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.5</version>
    <configuration>
      <encoding>${project.build.sourceEncoding}</encoding>
      <nonFilteredFileExtensions>
        <nonFilteredFileExtension>jar</nonFilteredFileExtension>
        <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
        <nonFilteredFileExtension>swf</nonFilteredFileExtension>
        <nonFilteredFileExtension>zip</nonFilteredFileExtension>
        <nonFilteredFileExtension>bz2</nonFilteredFileExtension>
        <nonFilteredFileExtension>gz</nonFilteredFileExtension>
        <nonFilteredFileExtension>acp</nonFilteredFileExtension>
        <nonFilteredFileExtension>bin</nonFilteredFileExtension>
        <nonFilteredFileExtension>odt</nonFilteredFileExtension>
        <nonFilteredFileExtension>doc</nonFilteredFileExtension>
        <nonFilteredFileExtension>xls</nonFilteredFileExtension>
      </nonFilteredFileExtensions>
    </configuration>
  </plugin>

请注意,我们添加了jar扩展名以及默认的maven排除文件类型(毕竟它是一个zip文件)。

除了避免归档文件的损坏外,还可以加快处理速度,因为不必过滤大文件。


1

1
我添加时遇到了类似的错误:


<copy ...>
<fileset ... />
<filterchain>
    <tokenfilter>
         <replacestring from="..." to="..." />
    </tokenfilter>
</filterchain>
</copy>

在ANT中,我遇到了复制任务时的问题。当复制jar文件时,它们会被损坏。 我通过仅将过滤器应用于目标文本文件而不是jar文件来解决了这个问题。


我也遇到了antrun插件的同样问题:您能否请解释一下如何解决这个问题? - Alessandro C

1

除了其他答案之外,另一个选项是仅针对需要过滤的资源启用过滤:

<build>
...
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
                <includes>
                    <include>core.properties</include>
                </includes>
            </resource>
            <resource>
                <filtering>false</filtering>
                <directory>src/main/resources</directory>
                <includes>
                    <include>pdf/color_profile/sRGB.icc</include>
                </includes>
            </resource>
        </resources>
</build>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接