【问题标题】:Understanding External Jars in Eclipse了解 Eclipse 中的外部 Jar
【发布时间】:2012-05-01 13:30:45
【问题描述】:

所以我对 Java 尤其是 Eclipse 还很陌生,所以请原谅我的无知。我从服务器获取了一个项目并将其本地复制到我的机器上。当我打开工作区时,由于找不到罐子,我遇到了很多错误。这是有道理的,因为我没有与我从中复制的服务器相同的目录结构。因此,如果我将相同的外部 jar 复制到我的机器并让它编译成一个 jar 并将其复制回服务器,它会工作吗?还是会因为现在外部 jar 位于与预期不同的位置而失败?

另外,我应该将外部罐子放入普通罐子中以避免这个问题吗?

【问题讨论】:

  • 所以经过更多研究,看起来他们正在使用包含外部 JAR 的用户库。我可以更改用户库的 JAR 的路径以指向我的本地副本吗?如果可以的话,我是否可以将我的可执行 JAR 复制回服务器而无需更改任何其他内容?感谢您的所有回复。

标签: java eclipse jar classpath


【解决方案1】:

你应该没事的。 Java 使用所谓的类路径来定位依赖项。开发机器上的类路径可能不同,但只要所有依赖项都在生产环境中的类路径上,一切都应该工作。

为了避免目录结构的同步问题,最常见的方法是使用 Maven - 它会为您管理所有依赖项(但您必须管理 pom.xml - Maven 的项目描述符)。有点笨拙的方法是在项目中拥有依赖项,但是您最终可能会导致许多项目必须包含相同的 jar,然后会出现版本冲突等等。

对于小型项目,您可以自己管理依赖项,但较大的项目需要更深思熟虑的策略(如 Maven)。

关于可执行的 jars,确保 :\META-INF\MANIFEST.MF 中的 Class-Path 条目是正确的,例如在它引用其他罐子的地方,这些罐子将在生产中出现。例如,假设我们有 ourjar.jar 并假设这是来自其 MANIFEST.MF 的 sn-p:

Class-Path: lib/myteamjar.jar

然后预计会有以下目录结构:

lib/myteamjar.jar
ourjar.jar

【讨论】:

  • 感谢您的回复。我在上面发布了更多信息。将来我一定会关注 Maven,听起来是个有用的工具,但现在我时间紧迫。
  • 我在上面的答案中添加了更多信息。我建议你更改用户库路径,生成你的 jar 文件,检查清单是否正确。那你就确定了。
  • 当我查看当前 JAR 的 manifest.mf 时,它没有类路径条目,它只是说:Manifest-Version: 1.0
  • 如果版本是它的全部,严格来说它不是一个“可执行”jar。可执行 jar 清单需要具有 Main-Class 属性,这样您就可以像 java -jar myjar.jar 一样简单地执行它 - 它指示 Java 在哪里寻找 main() 方法。鉴于您没有 class-path 属性,您的 classpath 是在执行时给出的,所以不是一成不变的,可能像这样:java -cp lib/myteamjar.jar:ourjar.jar our.team.package.Main
  • 看起来这个 jar 被另一个程序使用了,并且不能像你说的那样执行。所以我应该能够将它从一个位置复制到另一个我希望的位置。我会试试看,让你知道。感谢所有的帮助。
【解决方案2】:

不,外部罐子的位置不重要。您想要做的是将外部 jar 放在您的类路径中。你如何做取决于你如何运行你的java代码。如果您使用 java 命令从 CLI 运行它,它会将类路径作为参数。如果您希望您的代码在 Eclipse 中构建/运行,您需要右键单击您的项目,选择“构建路径”>“配置构建路径...”使用“添加 JAR...”按钮添加您打开的项目的一部分并“添加外部 JAR...”以添加驻留在项目外部的 jar。有关类路径的更多详细信息,请参阅您的工具的特定文档。

【讨论】:

    【解决方案3】:

    我不会向刚接触 Java 和 Eclipse 的人推荐 Maven。我也会忘记 Eclipse。

    您遇到了打包和 CLASSPATH 问题。专注于此。

    您在谈论什么样的项目?您得到的答案将取决于您正在创建的应用程序类型。它是一个可执行的 JAR 吗?那么正确的做法是将所有内容打包到一个 ZIP 文件中,该文件的布局与 JAR 清单中的 CLASSPATH 完全一致。

    如果它是一个 Web 应用程序,正确的东西是一个 WAR 文件,在 WEB-INF/lib 目录中包含您的应用程序所需的所有 JAR。

    如果你正确地打包东西,你应该最终得到一个包,所有的东西都以正确的方式布局。您应该能够将其部署到服务器并使其正常工作。

    【讨论】:

    • 这是一个可执行的 JAR。我在上面发布了它使用包含外部 JAR 的用户库,因为它们位于不同的位置,所以它无法找到。如果我在我的机器上重新创建(或更改路径)用户库并创建可执行的 JAR,当我将它复制回原始服务器时,它听起来可能会起作用?
    • 您必须将第 3 方 JAR 与您的 JAR 一起打包并将它们部署在服务器上。我的建议是将它们全部放在一个目录中,将其压缩,并让类路径指向它们所在的目录。设置一个运行 JAR 并设置 CLASSPATH 的脚本,你将没有问题。
    猜你喜欢
    • 2012-07-25
    • 2018-11-15
    • 2012-01-13
    • 2014-02-24
    • 1970-01-01
    • 2012-04-07
    • 2013-09-23
    • 2011-09-11
    • 2012-01-22
    相关资源
    最近更新 更多