我刚刚问了一个关于分发可执行JAR及其依赖关系的最新问题,这让我意识到我对JAR的理解可能存在根本性缺陷。编译Java和JAR
因此,有些人可能会说:“嘿现在!这这里是一个重复的问题!”但是我会拒绝,这个问题的this 原来的问题一个完全独立的分支,并涉及Java的基础!
如果我有一个依赖于Apache Commons CLI和JODA Time的应用程序,并且将此应用程序打包为可分发的JAR,我的原始问题是:不包括CLI和JODA JAR我的JAR,程序如何在客户端运行?
我现在在想,因为我的代码使用CLI和JODA编译到类文件中,并且字节码是打包的,所以不需要包含CLI或JODA(或任何其他第三方JAR )在我的JAR中,因为它现在都在运行字节码。
有人可以确认或纠正我吗?这个启示虽然很晚,但却令人震惊。
一个的* .jar *是你应该在包装罐中的清单文件中指定的类路径基本上是一个* .zip *,所以我建议你通过解压几个* .jar *然后看看里面是什么来自己做实验。请注意,您可以**将“罐子放在罐子里”*,但是您需要编写自己的类加载器(或者使用一个程序来完成这一切)。另一种方法是将你所依赖的* .class *(*即*字节码)放在你的* .jar *文件中(不推荐,但它可以工作)。 – SyntaxT3rr0r
你的应用程序。有一个GUI? –
@Mara:btw你的* .class *文件不包含整个CLI和JODA库。 .class文件具有依赖性:您需要在* .jar *或CLI和JODA *中使用来自CLI和JODA的.class文件。jar *某处。运行* .jar *时,这些依赖关系将得到解决(或尝试解决)。如果你有自己的类加载器,默认的类加载器将检查几个地方(在路径中,在你的*。jar *中,在jar中的jar中)等,并看看它是否能解决你的依赖。 – SyntaxT3rr0r