java - 未在可执行 jar 中加载的库
问题描述
我有以下 Maven 配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<release>${java.version}</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>${main.class}</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<classpathLayoutType>repository</classpathLayoutType>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
<manifestEntries>
<Class-Path>./lib/*.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
程序集.xml:
<assembly>
<id>assembly</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<unpack>true</unpack>
<includes>
<include>com.relax-gaming.casinoworld:casinoworld</include>
</includes>
</dependencySet>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
<excludes>
<exclude>com.relax-gaming.casinoworld:casinoworld</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>
我的清单内容是:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: username
Build-Jdk: 11
Specification-Title: project title
Specification-Version: 0.0.1-SNAPSHOT
Implementation-Title: Project title
Implementation-Version: 0.0.1-SNAPSHOT
Implementation-Vendor-Id: groupid
Main-Class: path.to.main.class
Class-Path: ./lib/*.jar
我的 jar 捆绑如下:
-my.code.package (from src/main/java)
+ META-INF
- MANIFEST.MF (where the above configuration is)
+ lib
- dep1.jar (all the dependencies as jar files)
-my.resources.file (from src/main/resources)
当我使用 java -jar 运行文件时,我得到 NoClassDefFound errosr 导致库未加载。
我想问题是我在清单文件中的类路径。应该是什么?
解决方案
所以,结果你有点做不到。
我的解决方案如下:
更新 assembly.xml 和 pom.xml,如下所示:
部件:
<assembly>
<id>assembly</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<unpack>true</unpack>
<excludes>
<exclude>groupId:artifactIdOfResourceIWant</exclude>
</excludes>
</dependencySet>
<dependencySet>
<outputDirectory>lib-packed</outputDirectory>
<unpack>false</unpack>
<includes>
<include>groupId:artifactIdOfResourceIWant</include>
</includes>
</dependencySet>
</dependencySets>
</assembly>
pom:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>${main.class}</mainClass>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
这基本上可以正常解压所有依赖项,但将需要解压的特定依赖项作为 jar 文件保留在 jar 文件中。这将复杂性降低到只需要解压的罐子。
现在,问题仍然存在,Class-Path 只能采用 dir/* 语法从外部加载所有 jar,并且不能用于加载 jarfile(即使具有特定名称)所以将 jar 捆绑在里面并拥有它自动加载我基本上需要修改我的代码以具有读取该文件的自定义类加载器。
推荐阅读
- amazon-web-services - 从 API Gateway 调用 AWS Step Function 同步 Express Workflow 并从响应输出中消除状态机详细信息
- xcode - Package.resolved 文件已损坏或格式错误
- java - 通过注解收集 JUnit 测试元数据
- java - Spring Batch 通配符 ItemWriter
- android - 如何测试在浓缩咖啡中单击视图时是否调用函数
- javascript - 如何创建一个使用嵌套组件属性的 Svelte 组件?
- c# - 为什么 BinarySearch 使用 ~ 运算符返回负数?
- unity3d - 动画问题 Unity2D
- r - 无法在 Sentimentr 中获取 update_polarity_table 以更新极性
- python - windows中python/pygame的问题,但在linux中运行良好