我如何安装一个罐子?

时间:2015-01-21 21:34:11

标签: java jar classpath

我正在阅读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.

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

在我看来,第二个命令包含一个标志-cp,它修改了类路径。我猜这意味着我需要做的就是将我的jar文件移动到一个特定的目录中。我尝试将它放在/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.33.x86_64/jre/lib中,但是没有这样做,所以第二个命令就可以了。我很难过,并且非常感谢任何关于我需要移动这个罐子的建议,以便将其视为已安装

5 个答案:

答案 0 :(得分:0)

  

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

我想说你需要在类路径中明确地包含jar文件本身。就个人而言,我通常不会尝试安装"你描述的一个jar,而是创建某种脚本或可执行jar文件,这将有助于建立正确的类路径。

编辑:在将代码部署到应用程序服务器的上下文中,然后安装" jar会有意义 - 通常在应用程序服务器上有一个共享的lib文件夹,你可以简单地删除jar,代码将对服务器上运行的所有应用程序可用 - 这可能会变得有点然而,管理上的一个令人头疼的问题是,我常常希望在应用程序之间共享jar文件时完全自包含部署 - 但是,YMMV。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您评论如此:

  

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

这是一个坏主意,因为(至少)以下原因:

  • 将内容放入extensions目录可能会影响您执行的每个Java应用程序。不只是您正在尝试的应用程序&#34;安装&#34;。在某些情况下,由于版本冲突等原因可能导致意外破损。

  • 更新Java安装时,标准安装程序,RPM或其他任何内容将创建新的安装树。但它不会从现有安装中复制任何内容。因此,Java更新可能会破坏依赖于&#34;扩展&#34;中的内容的任何应用程序。

  • 如果您尝试通过&#34;嵌入&#34;来解决上述问题在Java安装中,您可能会忘记Java安装的位置。这使得应用Java安全补丁成为问题。当然,嵌入式JRE占用了大量的磁盘空间......每次约100Mb。