使用 maven 构建时 jar 文件被损坏

问题描述 投票:0回答:6

在构建一个战争文件时,我将一组罐子从一个位置复制到战争中的一个文件夹中。虽然文件确实被复制,但我认为它们被损坏了,因为在战争之外获取的 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

但是,当我在原始文件夹(即战争之外)中查看它时,可以查看相同的类文件。 那么复制罐子时是否有错误? 谢谢。

java maven-plugin maven-3
6个回答
69
投票

删除

<filtering>true</filtering>
,它会损坏 jar 文件。


17
投票

此外,您可以继续使用 Maven 过滤,而不会损坏内部的 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
投票

尝试 Maven 组装插件。这是我最喜欢的将自定义资源添加到 *.war 文件的插件。另请参阅预定义描述符文件


1
投票

我添加时也遇到类似的错误

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

我在 ANT 中的复制任务。复制 jar 文件时它损坏了它们。 我通过仅在目标文本文件上应用过滤器而不是在 jar 文件上解决了这个问题。


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>

0
投票

我的问题是ClassPaths之间有多个空格和换行符。必须将其分开 1 个空格。通过jd-gui检查过

© www.soinside.com 2019 - 2024. All rights reserved.