Maven shade插件包装DLL

时间:2014-06-03 09:25:09

标签: java maven dll

我必须在我的项目中添加一个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?

2 个答案:

答案 0 :(得分:0)

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

  1. 打包项目时不包含DLL个文件。
  2. 将您的DLL文件复制并粘贴到jar文件目录中。
  3. 现在您可以运行您的应用程序,因为所有DLL文件现在都位于jar应用程序的类路径中。

您的目录应如下所示:
/target/application.jar
/target/your_DLL_files.dll

答案 1 :(得分:0)

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

在您的 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 中释放你需要的一切。我不知道这是否是最好的解决方案,但也许它可以解决您的用例的问题。