我有一个具有以下结构的项目:
.
├── bundleA
│ ├── pom.xml
│ └── src
├── bundleB
│ ├── pom.xml
│ └── src
├── distribution
│ ├── pom.xml
│ └── src
│ └── assemble
│ └── example.xml
└── pom.xml
bundleA
和 bundleB
poms 很简单,不会影响此问题。
分发pom.xml
:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.example</groupId>
<artifactId>testproject</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>distribution</artifactId>
<version>1.0-SNAPSHOT</version>
<name>distribution</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.lwjgl.lwjgl</groupId>
<artifactId>lwjgl</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>distro-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/assemble/example.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
example.xml
程序集描述符:
<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">
<id>example</id>
<formats>
<format>dir</format>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<includes>
<include>org.lwjgl.lwjgl:lwjgl</include>
</includes>
<outputDirectory>/libs</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<moduleSets>
<moduleSet>
<useAllReactorProjects>true</useAllReactorProjects>
<includes>
<include>com.example:bundleA</include>
<include>com.example:bundleB</include>
</includes>
<binaries>
<outputDirectory>/bundles</outputDirectory>
<unpack>false</unpack>
</binaries>
</moduleSet>
</moduleSets>
</assembly>
这里的问题:当我将 lwjgl (或几乎任何其他带有打包在分类子项目中的 native 库的项目)包含到 distribution
项目的依赖项中并在程序集描述符中引用它时 - 我得到分发构建后的疯狂:
distribution/target/distribution-1.0-SNAPSHOT-example
├── bundles
│ ├── bundleA-1.0-SNAPSHOT-natives-linux.jar
│ ├── bundleA-1.0-SNAPSHOT-natives-osx.jar
│ ├── bundleA-1.0-SNAPSHOT-natives-windows.jar
│ ├── bundleA-1.0-SNAPSHOT.jar
│ ├── bundleB-1.0-SNAPSHOT-natives-linux.jar
│ ├── bundleB-1.0-SNAPSHOT-natives-osx.jar
│ ├── bundleB-1.0-SNAPSHOT-natives-windows.jar
│ └── bundleB-1.0-SNAPSHOT.jar
└── libs
└── lwjgl-2.9.0.jar
换句话说,lwjgl 的每个本地 * 分类子项目都会根据我项目中的包数量神奇地复制为唯一的名称(但 jar 的大小和内容完全相同),这太疯狂了。
我想要的是一种指定 lwjgl 平台无关的 jar 的方法(不包含 native )或某种其他方法来从生成的分发中排除此 native -* jar。
这个项目在 github 上:https://github.com/iamtakingiteasy/maven-assembly-plugin-insanity
最佳答案
嗯,这可能不是最好或直接的解决方案,但使用
<moduleSets>
<moduleSet>
...
<binaries>
...
<includeDependencies>false</includeDependencies>
...
</binaries>
...
</moduleSet>
</moduleSets>
似乎有帮助。关键是开始查看捆绑选项,而不是尝试对 lwjgl 本身做一些事情。
此外,直接排除 * 平台依赖项(再次在 bundle 部分中)可能是解决方案:
<moduleSets>
<moduleSet>
...
<binaries>
...
<excludes>
<exclude>org.lwjgl.lwjgl:lwjgl-platform</exclude>
<exclude>net.java.jinput:jinput-platform</exclude>
</excludes>
...
</binaries>
...
</moduleSet>
</moduleSets>
关于java - 如何防止 maven- assembly-plugin 以疯狂的方式从 dependencySet 复制 natives-* 分类器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20380273/