您不能只在您的 jar 中包含 3rd 方 jar。清单中的类路径与您正在运行的 jar 相关。
例如,如果您有依赖于 my-utils.jar 的 my-application.jar 并且两者都在同一个目录中,那么您的清单类路径将是:
Class-Path: my-utils.jar
如果你只是将 my-utils.jar 移动到 lib 目录,我会得到这样的布局:
+ my-application.jar
+ lib
+ my-utils.jar
您的清单类路径将是:
Class-Path: lib/my-utils.jar
现在解决您的问题。
首先,您应该真正将所有库放入存储库。 Maven 是为从存储库工作而构建的,违反“Maven 方式”通常会导致以后出现问题。
另一种方法(我不推荐)是使用system 范围声明依赖关系,它允许您指定路径,例如:
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>my-utils</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>lib/my-utils.jar</systemPath>
</dependency>
但是,请谨慎使用。 system 范围旨在与系统 jar 一起使用,通常是 JVM 中的那些。将它与其他任何东西一起使用实际上是对该功能的滥用,并且可能会影响您构建的可移植性。
一旦你有你的依赖,你需要打包你的应用程序。正如我所提到的,在您的应用程序 jar 中包含依赖项 jar 将不起作用。我通常使用Assembly Plugin,它允许我创建一个压缩包,可以简单地解压缩以安装应用程序。
Assembly Plugin 来自一个简单的描述符,在您想要包含应用程序 jar 和依赖项 jar 的情况下,它看起来像这样:
<?xml version="1.0"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"
>
<id>${project.name}</id>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<includes>
<include>${artifact.groupId}:${artifact.artifactId}</include>
</includes>
</dependencySet>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</assembly>
(您可能需要稍微玩一下include)
您还可以包含运行应用程序的脚本和程序集中所需的属性。