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的主要内容,如果未能解决你的问题,请参考以下文章