Maven在构建jar时破坏源/主/资源中的二进制文件

问题描述:

我有一个Maven项目的问题,我正在从src/main/resources/lib文件夹中分发dll。Maven在构建jar时破坏源/主/资源中的二进制文件

该项目使用maven-assembly-plugin作为一个具有依赖项的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-resources-plugin配置的答案。我根据需要将我的二进制文件放在src/main/resources/unfiltered-resources文件夹中,以过滤我的其他资源。

这是链接到source code

下面是我撰写本文时的最后一份工作。

<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> 

这一部分:

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

应当根据<build/>部分像这样下:

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

当它装配插件踢为时已晚,因为资源已经由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>