我刚刚问了一个关于分发可执行JAR及其依赖关系的最新问题,这让我意识到我对JAR的理解可能存在根本性的缺陷。
因此,有些人可能会说“嘿,现在!这是一个重复的问题!”但我说不,这个问题是this完全独立的分支 原始问题,关注Java基础知识!
如果我的应用程序依赖于Apache Commons CLI以及JODA Time,并且我将此应用程序打包成可分发的JAR,那么我的原始问题是:不包括CLI和JODA JAR在我的JAR中,程序如何在客户端运行???
我现在想的是,由于我的代码(使用CLI和JODA)被编译成类文件,并且字节码被打包,因此不需要包含CLI或JODA(或任何其他第三方JAR)我的JAR,因为它现在都在运行字节码。
有人可以确认或纠正我吗?这个启示虽然很晚才到来,却是惊人的。
答案 0 :(得分:1)
不,这不太对。一切的关键是类路径。是否所有已编译的代码和/或其他资源都在类路径上?如果您将所有内容打包在一个jar中,那么是的,它位于类路径中,JVM将找到要运行的所有资源。否则,您需要指定(使用.bat或.sh文件或其他内容)应用程序所依赖的所有资源,以便JVM能够适当地查找这些资源(无论是Java代码或属性文件还是其他任何资源) )。
此外,如果我正在阅读您的问题,您是否假设CLI和JODA代码已编译到您的代码中?如果是这样,我讨厌破坏你的泡沫,但事实并非如此。当您的代码编译时,它不会带来依赖关系(不是您可能在考虑的意义上)。它在概念层面做了什么(如果我错了JVM大师,请纠正我)是它引用其他类。这些引用是您在编写类并编译它时所构建的内容。在运行时,JVM将尝试在引用后面找到已编译的类,并且您需要在类路径中使用这些类的jar,或者在可执行jar中需要这些类。
有意义吗?
答案 1 :(得分:1)
第三方库(例如JodaTime)需要在运行时期间位于类路径上。不是“打包在你的JAR中”。
如果您的应用是从JAR启动的。您应该在清单文件中指定包含在jar中的类路径 - http://download.oracle.com/javase/tutorial/deployment/jar/downman.html
您可以让ANT使用 manifestclasspath 元素为您生成清单类路径 - http://ant.apache.org/manual/Tasks/manifestclasspath.html