Maven shade plugin Packaging DLL

2022-09-02 14:10:44

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

如何告诉阴影插件不解压缩dll?


答案 1

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


答案 2

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

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

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


推荐