2009-11-12 86 views
0

快速个人背景:我几个月前被其他开发人员都是PHP开发人员的公司聘为唯一.NET开发人员(C#)。工作一周后,我被告知他们想改用Java而不是.NET。不是一个理想的情况,但我试图让它工作。Java库和类路径问题

我不认为我理解项目库和类路径之间的关系。我正在使用NetBeans 6.7.1进行开发。我目前的项目是创建一个应用程序,将更新多个商家来源(易趣,亚马逊等)。我创建了一个处理这些更新计划的类库项目。我们将其称为更新。

我正在为各种来源(例如eBay)创建类库项目。我将ebay项目添加到更新项目作为库。在IDE中有一个框显示“在类路径上生成项目”,该项目被选中。

最后,现在我有了一个库中引用的更新项目(使eBay的项目,现在2个库深)以同样的方式一点点控制台应用程序。它适用于Update项目中的代码。

这工作正常,直到我实例化ebay项目中的类(从更新项目通过控制台应用程序)。在这一点上,我收到了

Exception in thread "main" 
java.lang.NoClassDefFoundError 

这是

Caused by: java.lang.ClassNotFoundException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 

这些项目都建立罚款,但这种运行时异常是杀害我。我不知道我是否真的明白将项目库添加​​到项目中的作用,以及是否还需要做更多的事情才能使课程更容易访问。我习惯于能够添加对DLL的引用并且很好。我不明白为什么我没有得到任何编译器错误或构建错误,但我得到有关可访问性的运行时错误。我猜测classpath是一个我不明白的东西,尽管我认为这个问题可能与其他东西完全相关。

回答

1

的解决方案,我想出现在:

我预计从嵌套库提及“冒泡”。这显然不适用于类路径。我的结构基本上是:

A具有参考B的参考到C

当我跑了它工作得很好,直到它在C.了的东西我所做的是通过添加给予直接引用到C它作为该项目的图书馆。从一些快速的Google搜索中,它看起来很像是如何将类路径添加到NetBeans中的项目。

这对我来说似乎有点混乱,也许有更好的方法来做到这一点,但它现在已经解决了我的问题。感谢大家的回答 - 虽然没有人精确地解决了我的特殊问题(你们让我大概有95%的方法),但他们证实了我的想法,并使我能够找出最后一点。

2

在Java中,与C#不同,您需要将类路径显式添加到项目中。我使用日食,我必须做到这一点,得到一些加载的引用的罐子。

3

我强烈建议您选择Core Java第1卷和第2卷。它们对于想要了解语言内部(如ClassLoader)的Java开发人员必须读取。至少,请阅读课程加载。

要回答你的问题,Update项目应该生成.class文件或jar。您需要在您的类路径中具有您引用它们的项目的类文件或jar的位置。根据您的IDE,对项目的引用可能只会让您访问源代码,以进行编译。

3

您需要将Java概念从IDE特定的概念中分离出来。我建议在跳入NetBeans之前,使用文本编辑器和命令shell通过简单的java教程。

库和项目是NetBeans的特定术语。我不是NetBeans用户,所以我不会猜测他们是什么,尽管我有一些猜测,但我会说他们的配置很可能会影响编译时环境。

Classpath是一个核心的java概念。您必须在运行时将所有类(或包含这些类的jar)的路径提供给java命令,以便它能够加载这些类。(您还需要在编译时针对您引用但目前不编译的类执行javac命令)。

任何时间您看到java.lang.ClassNotFoundException,这意味着当您启动运行时时,类路径中缺少编译代码时出现在类路径中的某个类。

1
Exception in thread "main" 
java.lang.NoClassDefFoundError 

类名中缺少的错误消息,但让我们假设这是你想要执行main方法的类本身。在这种情况下,这意味着Java无法在运行时类路径中找到特定的类。

为了解决这个问题需要cd到其中类位于然后将包的根如下重新执行java命令:

java -cp . com.example.MainClass 

这里-cp参数指定的类路径。它只有一个值.这意味着当前的工作目录应该被带入类路径(这通常是默认情况,但比没有更安全)。

或者,你可以在-cp参数指定它的完整路径,这样就可以从任何地方执行它,例如:

java -cp /path/to/package/root com.example.MainClass 

这是最见于教程对于初学者,但通常不被使用的另一种替代方案由专业人士定义一个%CLASSPATH%环境变量,其中您准确地输入了您想要在-cp参数中使用的值。然后java命令将查找它(只要您使用而不是使用-cp,-classpath-jar参数之一)。

如果输入长命令会感到厌倦,您可以使用批处理或shell文件,以便您可以轻松管理它。

如果您有一个JAR文件或其他根文件夹文件夹,并且您想在程序中使用这些文件夹,那么您需要将它们追加到类路径中。在Windows上时,分隔符是分号;,在Linux上分隔符是:。更进一步,当路径包含空格时,您需要引用特定的路径。这里是一个Windows的例子:

java -cp .;/path/to/package/root;"/spacy path/to/file.jar" com.example.MainClass 

希望这会有所帮助。

+0

感谢您的帖子。事实证明,这与NetBeans中的引用问题有关(请参阅我自己对此问题的回答)。我假设一个项目是自包含的(不正确的)假设 - 如果它自己设置了所有的引用,那么使用该项目的任何东西都可以引用项目本身 - 而不需要引用所有的片断,所引用的项目也是使用。 – 2009-11-12 20:27:01