【问题标题】:How Do I Install a Jar?我如何安装一个罐子?
【发布时间】:2015-01-21 21:34:11
【问题描述】:

我正在阅读 db2jcc4.jar 的一些文档时,以下内容引起了我的注意(已添加重点):

如果从命令行执行,以下命令将检索 JCC 驱动程序版本:

java com.ibm.db2.jcc.DB2Jcc -version

或者对于尚未安装的驱动程序:

java -cp ./db2jcc.jar com.ibm.db2.jcc.DB2Jcc -version

我只有db2jcc4.jar 文件——它没有附带安装程序或任何东西。我可以运行第二个命令,它工作正常,但第一个给了我这个堆栈跟踪:

Exception in thread "main" java.lang.NoClassDefFoundError: com.ibm.db2.jcc.DB2Jcc
Caused by: java.lang.ClassNotFoundException: com.ibm.db2.jcc.DB2Jcc
    at java.net.URLClassLoader.findClass(URLClassLoader.java:434)
    at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:665)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:644)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:358)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:627)
Could not find the main class: com.ibm.db2.jcc.DB2Jcc.  Program will exit.

这告诉我 jar 尚未安装。在我使用 Java 的所有时间里,我从未听说过安装 jar。如何使第一个命令起作用而不是出现此问题并打印堆栈跟踪?如何安装 jar

在我看来,第二个命令包含一个标志-cp,它修改了类路径。我猜这意味着我需要做的就是将我的 jar 文件移动到特定目录中。我试着把它放在/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.33.x86_64/jre/lib 中,但没有成功,所以第二个命令可以工作。我很困惑,如果我需要将这个 jar 移动到哪里才能被视为 已安装,我将不胜感激。

【问题讨论】:

  • 我不建议将 jar 安装为 JRE 扩展,它会将您的应用程序耦合到 JRE 安装。为什么不将第二个选项用作 shell 脚本的一部分?
  • @ChristianWilkie:我的问题更多是关于“安装”文档的含义,而不是如何实际运行这个特定命令。我在 jar 中的某些类出现了一些非常奇怪的行为,有时会找到类,而有时却找不到类(尽管类加载器日志显示它已明确加载)。我只是在阅读完整的文档时突然想到,根据他们的定义,我没有“安装” jar,所以我想知道如何才能满足这一点。一旦我这样做了,问题就消失了,我接受了答案。

标签: java jar classpath


【解决方案1】:

没有所谓的“安装”罐子。要被 Java 应用程序使用,jar 必须可以在类路径中访问。看看这个链接:

http://docs.oracle.com/javase/tutorial/essential/environment/paths.html

【讨论】:

  • 您的链接有此注释 - (属于 JRE、JDK 平台和扩展的类应通过其他方式定义,例如引导类路径或扩展目录。) - 如何我打算通过那个添加罐子吗?
  • 你不应该这样做,但如果有必要的话:docs.oracle.com/javase/tutorial/ext/basics/install.html
  • @ArtOfWarfare - “你不应该这样做”的哪一部分你不明白? :-)
  • @ArtOfWarfare - 如果你不明白为什么这是一个坏主意,你怎么能这么说?例如,假设我告诉过您用户忘记密码的解决方案是将所有密码设置为“秘密”。它完成了工作......但还有更多。
  • @StephenC:我理解为什么如果这个 JVM 安装将存在很长时间并用于其他事情会是一个坏主意,但它不会。这是运行单个应用程序的服务器 VM。我启动并弹性地抛出虚拟机以根据需求进行扩展。我不关心它运行其他应用程序的能力或更新 Java(我的启动脚本的一部分涉及获取最新的 Java 副本,然后它会插入这个 jar。)
【解决方案2】:

通过安装 java jar 意味着该 jar 可用于您的程序(实际存在并在您的类路径中找到)。如果没有设置 jar 的路径,那么您必须选择: + 将 jar 文件复制到现有路径 + 在命令行中包含 jar 文件

java -cp <path_to>/db2jcc.jar com.ibm.db2.jcc.DB2Jcc -version

【讨论】:

    【解决方案3】:

    在我看来,第二个命令包含一个标志 -cp,它修改了类路径。我猜这意味着我需要做的就是将我的 jar 文件移动到特定目录中。

    我会说您需要在类路径中明确包含 jar 文件本身。就个人而言,我一般不会尝试像您描述的那样“安装”一个 jar,而是创建某种脚本或可执行 jar 文件来帮助建立正确的类路径。

    编辑:在将代码部署到应用程序服务器的上下文中,“安装”jar 是有意义的——通常在应用程序服务器上有一个共享的 lib 文件夹,您可以在其中简单地删除 jar,代码将变为可供服务器上运行的所有应用程序使用——这可能会成为管理上的一个难题,但是我通常更喜欢完全独立的部署,而不是在应用程序之间共享 jar 文件——YMMV。

    【讨论】:

      【解决方案4】:

      你是这样评论的:

      您的链接有此评论 - (应通过其他方式定义属于 JRE、JDK 平台和扩展的类,例如引导类路径或扩展目录。) - 我将如何添加通过那个罐子?

      这是个坏主意,原因(至少)如下:

      • 将内容放入扩展目录可能会影响您执行的每个 Java 应用程序。不仅仅是您尝试“安装”的应用程序。在某些情况下,这可能会由于版本冲突等导致意外损坏。

      • 当您更新 Java 安装、标准安装程序、RPM 或任何将创建新安装树的东西时。但它不会从现有安装中复制任何内容。因此,Java 更新可能会破坏任何依赖于“扩展”中内容的应用程序。

      • 如果您尝试通过“嵌入”Java 安装来解决上述问题,您可能会失去对 Java 安装位置的跟踪。这使得应用 Java 安全补丁存在问题。当然,嵌入式 JRE 会占用大量磁盘空间……每次大约 100Mb。

      【讨论】:

      • 这是一个运行单个应用程序的服务器虚拟机。我启动并弹性地扔掉 VM 以根据需求进行扩展。我不关心它运行其他应用程序的能力或更新 Java(我的启动脚本的一部分涉及获取最新的 Java 副本,然后它会插入这个 jar。)
      【解决方案5】:

      我怀疑“安装 JAR”是一个选择不当的术语,这可能意味着将 jar 放在 JVM 类路径上”——即为了使其可用于应用程序。推荐的这样做方式因 Java 而异平台(无论是服务器平台还是客户端平台)。

      例如,在 Java EE 服务器上,您可以将 jar 文件打包到应用程序中,或将其定义为共享库,并将其附加到服务器的类加载器或应用程序的类加载器,以使其可供该应用程序使用。第三方应用程序,例如各种 IBM 产品,将附带关于如何“安装”db2jcc4 驱动程序的自己的说明。

      【讨论】:

        猜你喜欢
        • 2012-12-28
        • 2013-06-19
        • 1970-01-01
        • 2019-03-03
        • 2017-07-25
        • 2017-05-20
        • 1970-01-01
        • 2011-09-22
        • 2011-03-25
        相关资源
        最近更新 更多