我正在制作一个简单的批处理程序,应将其打包在包含所有依赖项的 JAR 中。 JAR-in-JAR eclipse 方式使我的程序如此缓慢,所以我选择将所需的库提取到我的 JAR 中。这样可以加快执行速度,但会使我的 JAR“根”文件夹变得非常冗长。为了提取 jar,我使用了
<zipfileset excludes="META-INF/**.*" src="${dep.dir}/antlr-2.7.7.jar" />
并且它工作正常。当我尝试使用这样的前缀
<zipfileset excludes="META-INF/**.*" prefix="dep/" src="${dep.dir}/antlr-2.7.7.jar" />
我的程序因 ClassNotFoundException 崩溃,因为它找不到该异常。我尝试编辑 MANIFEST 以将 dep/文件夹添加到类路径中,但它不起作用。有人可以帮助我吗?
最佳答案
Java 类文件必须存在于 .jar 文件中,并且其路径与其完全限定名称(即包+“.”+简单类名)完全匹配。例如,com.example.Person
类必须作为 com/example/Person.class
存在于 .jar 文件中。
这意味着在包含来自另一个 .jar 的类文件时,您不能使用 zipfileset
的 prefix
属性。
Class-Path attribute list 的 不引用 .jar 文件中的路径。它是其他 .jar 文件的相对 URL(相对于包含 list 的 .jar)的以空格分隔的列表。 .jar 文件始终被视为类路径条目的根;无法将 .jar 中的路径引用为类路径条目。
我不确定 .jar 文件的根目录有何“冗长”之处。据我所知,ANTLR 类仅向其中添加一个 org 目录。
关于java - 使用前缀解压 JAR 中的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29534069/