Maven shade插件打包DLL

Posted

技术标签:

【中文标题】Maven shade插件打包DLL【英文标题】:Maven shade plugin Packaging DLL 【发布时间】:2014-07-23 13:46:36 【问题描述】:

我必须在我的项目中添加一个 JNI 模块。

我在 Maven 中将模块安装为两个不同的工件:jar 库:

mvn install:install-file -DgroupId=com.test -DartifactId=ssa -Dversion=1.0 -Dpackaging=jar -Dfile=ssa.jar

以及带有 DLL 的运行时库

mvn install:install-file -DgroupId=com.sirio -Dpackaging=ddl -DartifactId=ssa-runtime -classifier=windows-x86 -Dversion=1.0 -Dfile=SSADll.dll

在我的 maven 项目中,我添加了这些依赖项:

    <dependency>
        <groupId>com.test</groupId>
        <artifactId>ssa</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>com.test</groupId>
        <artifactId>ssa-runtime</artifactId>
        <classifier>windows-$arch</classifier>
        <type>dll</type>
        <version>1.0</version>
        <scope>runtime</scope>
    </dependency>

我的问题是当我运行 shade 插件目标以创建一个具有依赖项的 jar 时,我收到错误:

Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.3:shade (default) on project ....: Error creating shaded jar: error in opening zip file sirio\ssa-runtime\1.0\ssa-runtime-1.0-windows-x86.dll 

如何告诉shade插件不要解压dll?

【问题讨论】:

maven-shade-plugin 旨在遮蔽像压缩文件一样的 jar 文件,这就是错误显示的内容。除此之外你不能。您可以将您的 dll 打包成一个简单的 jar 文件,这应该可以解决问题。 @khmarbaise 如果你解释一下如何做到这一点,它可能会很有用。 遇到和OP一模一样的问题,很想知道怎么解决。 【参考方案1】:

也许你需要的是不同的包装。使用您使用的所有 java 类和库制作带阴影的 jar,然后将此 jar 和 DLL 打包到一个 Zip 文件中以进行发布。为此,您可以使用 maven-assembly-plugin 和 zip 描述符,如下所示:

在你的pom.xml

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>zip.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

zip.xml 文件中:

    <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
        <id>release</id>
        <formats>
            <format>zip</format>
        </formats>
        <fileSets>
            <fileSet>
                <directory>target</directory>
                <includes>
                    <include>myapp.jar</include>
                </includes>
                <outputDirectory>/</outputDirectory>
            </fileSet>
        </fileSets>
        <files>
            <file>
                <source>your.dll</source>
                <fileMode>0644</fileMode>
            </file>
        </files>
    </assembly>

这样您就拥有了在此 zip 中发布所需的所有内容。我不知道这是否是最好的解决方案,但也许它可以解决您的用例的问题。

【讨论】:

【参考方案2】:

此解决方案适用于我的 JavaFX-OpenCV 项目

    在没有DLL 文件的情况下打包您的项目。 将DLL 文件复制并粘贴到jar 文件目录中。 现在您可以运行您的应用程序了,因为所有DLL 文件现在都在您的 jar 应用程序的类路径中。

你的目录应该是这样的: /target/application.jar /target/your_DLL_files.dll

【讨论】:

以上是关于Maven shade插件打包DLL的主要内容,如果未能解决你的问题,请参考以下文章

maven-shade-plugin插件

maven shade插件小记

maven插件: shade, assembly

maven打包

Maven学习之打包插件

将 maven-bundle-plugin 与 maven-shade-plugin 一起使用