当前位置: 首页 > 知识库问答 >
问题:

Maven在构建jar时损坏src/main/resources中的二进制文件

梁丘波鸿
2023-03-14

我在一个maven项目中遇到了一个问题,在这个项目中,我从src/main/Resources/lib文件夹分发dlls。

该项目使用maven assembly插件构建为一个具有依赖项的jar。

不幸的是,maven进程正在复制过程中损坏我的dll库,因此它们对应用程序不再有用。

我已经了解了资源过滤等概念。

这是我的相关pom。xml

有人有什么想法吗?

我想我需要做一些像这样的事情,但到目前为止,这对我不起作用。

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>

                    <resources>
                        <resource>
                            <directory>${basedir}/src/main/resources/lib</directory>
                            <filtering>false</filtering>
                        </resource>
                    </resources>

                    <archive>
                        <manifest>
                            <mainClass>de.bochumuniruhr.psy.bio.behaviourcoder.Main</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>

我的最终解决方案(基于以下答案):

谢谢你的回答。我最终给出了一个答案,即不需要扩展maven资源插件的配置。我将二进制文件放在src/main/resources/unfilteredresources文件夹中,因为我需要筛选其他资源。

这里是源代码的链接。

下面是我写这篇文章时的最后一篇作品。

<build>
        <finalName>BehaviourCoder_${git.build.time}_${git.commit.id.describe-short}</finalName>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>${basedir}/src/main/unfiltered-resources</directory>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>pl.project13.maven</groupId>
                <artifactId>git-commit-id-plugin</artifactId>
                <version>2.2.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>revision</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <generateGitPropertiesFile>true</generateGitPropertiesFile>
                    <injectAllReactorProjects>true</injectAllReactorProjects>
                    <dateFormat>yyyy-MM-dd_HHmmss</dateFormat>
                    <dateFormatTimeZone>UTC</dateFormatTimeZone>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>de.bochumuniruhr.psy.bio.behaviourcoder.Main</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>

共有2个答案

贺佑运
2023-03-14

当程序集插件启动时,已经太晚了,因为资源已经被maven资源插件复制了。您应该在早期阶段(当资源被maven资源插件复制到目标文件夹时)排除过滤。

请参阅maven的文档如何做到这一点:https://maven.apache.org/plugins/maven-resources-plugin/examples/binaries-filtering.html

对于您的情况,这可能类似于:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <nonFilteredFileExtensions>
                    <nonFilteredFileExtension>dll</nonFilteredFileExtension>
                </nonFilteredFileExtensions>
            </configuration>
        </plugin>
    </plugins>
呼延钱明
2023-03-14

本部分:

                <resources>
                    <resource>
                        <directory>${basedir}/src/main/resources/lib</directory>
                        <filtering>false</filtering>
                    </resource>
                </resources>

应在

 <project>
      <build>
          <resources>
              <resource>
                  <directory>${basedir}/src/main/resources/lib</directory>
                  <filtering>false</filtering>
              </resource>
          </resources>
          <plugins>
              ...
          </plugins>
      </build>
 </project>

 类似资料:
  • 问题内容: 我在Maven项目中遇到问题,在该项目中我从src / main / resources / lib文件夹分发dll。 使用maven-assembly-plugin将项目构建为具有依赖项的单个jar。 不幸的是,maven进程在复制过程中损坏了我的dll库,因此它们不再对应用程序有用。 我看过诸如资源过滤之类的概念。 这是我相关的pom.xml 有人有什么想法吗? 我想我需要做这样的

  • 我正在为我的maven项目添加一个可执行的jar测试。我已经编辑了pom文件,以使用src/main/resources中的一个主类。但是,当我尝试运行jar时,它找不到我的主类。有什么想法吗?

  • 问题内容: 在构建战争文件时,我正在将一组罐子从某个位置复制到战争中的文件夹中。虽然文件确实会被复制,但是我认为它们已损坏,因为在战争之外被带出的jar的相同类文件会使用调试器打开,而从war文件中取出后不会打开。 这是我的战争pom.xml的一部分,我在其中复制了罐子 SomeSourceDirectory 有一些jar和其他文件结果是:myWar / somefolder / a.jar,但是

  • 您好,我正在我的java应用程序中使用来自src / main /resources的配置文件。我在课堂上读到它,就像这样: 所以现在我用maven使用来构建这个。这是我的pom中的位.xml: 所以当我运行我的应用程序时,我得到了这个错误: 但是当我右键单击组装好的罐子时,我可以看到里面,有人知道我做错了什么吗?

  • 我在我的maven项目中的src/main/资源下放置了一个文件,文件名只是temp.txt. 当我试图打开文件时: 我得到一个错误: src/main/资源下的所有文件都放在maven下类路径的根文件夹中。那么为什么程序不能在这里找到文件呢?

  • 问题内容: 在将Maven jFree依赖项添加到现有应用程序后,我将无法执行创建的jar。 我收到的唯一错误消息如下: 完整的外观如下所示: 如果执行jar,则不会得到其他任何调试信息。 是否可以验证jarfile?或有类似…的东西? 重现步骤: 新建一个文件夹 从上方将Pom.xml复制到该文件夹​​中。 保存小的`public static void main(…)。进入src / main