java - 如何防止 maven- assembly-plugin 以疯狂的方式从 dependencySet 复制 natives-* 分类器

标签 java maven lwjgl maven-assembly-plugin

我有一个具有以下结构的项目:

.
├── bundleA
│   ├── pom.xml
│   └── src
├── bundleB
│   ├── pom.xml
│   └── src
├── distribution
│   ├── pom.xml
│   └── src
│       └── assemble
│           └── example.xml
└── pom.xml

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

相关文章:

java - Espresso 'is enabled' 与所选 View 不匹配

java - 可滚动文本区域?

java - 将函数作为 Android Intent 的额外参数传递

java - Eclipse 未从中央 Maven 存储库下载插件

lwjgl - 如何在没有 mtl 的情况下在 blender 上导出 .OBJ 文件?

java - LWJGL .OBJ 文件读取器有时会导致文件变形或不渲染文件

java - 读取OGG作为LWJGL 3 OpenAL的样本流

java - SpringMVC存储Base64

java - Maven 配置

android - 如何让 Android Studio 下载依赖源和 javadoc?