Java库和类路径问题

Java库和类路径问题,java,netbeans,classpath,Java,Netbeans,Classpath,个人背景简介:几个月前,我被一家公司聘请为唯一的.NET开发人员C,该公司的其他开发人员都是php开发人员。工作一周后,我被告知他们想改用Java而不是.NET。这不是一个理想的情况,但我正在努力让它发挥作用 我认为我不理解项目库和类路径之间的关系。我正在使用NetBeans 6.7.1进行开发。我当前的项目是创建一个应用程序,该应用程序将更新eBay、Amazon等多个商户来源。我创建了一个类库项目,用于处理这些更新的计划。我们称之为更新 我正在为各种资源(如易趣)创建类库项目。我将易趣项目作

个人背景简介:几个月前,我被一家公司聘请为唯一的.NET开发人员C,该公司的其他开发人员都是php开发人员。工作一周后,我被告知他们想改用Java而不是.NET。这不是一个理想的情况,但我正在努力让它发挥作用

我认为我不理解项目库和类路径之间的关系。我正在使用NetBeans 6.7.1进行开发。我当前的项目是创建一个应用程序,该应用程序将更新eBay、Amazon等多个商户来源。我创建了一个类库项目,用于处理这些更新的计划。我们称之为更新

我正在为各种资源(如易趣)创建类库项目。我将易趣项目作为库添加到更新项目中。在IDE中有一个框,上面写着在类路径上构建项目,选中该框

最后,现在我有一个小的控制台应用程序,它将更新项目作为一个库引用,因此ebay项目现在以相同的方式有两个库。它与更新项目中的代码一起工作

在我通过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的引用,并且可以很好地运行。我不明白为什么我没有得到任何编译器错误或构建错误,但是我得到了关于可访问性的运行时错误。我猜类路径是我不太理解的缺失部分,尽管我认为这个问题可能完全与其他问题有关。

在Java中,与C不同,您需要显式地将类路径添加到project中。我使用eclipse,我必须这样做才能加载一些引用的JAR。

我强烈建议学习核心Java,第1卷和第2卷。它们是Java开发人员必须阅读的内容,这些开发人员想要理解语言的内部结构,比如类加载器。至少,阅读一下类加载


要回答您的问题,更新项目应该生成.class文件或jar。对于从中引用类文件的项目,您需要在类路径中拥有类文件或jar的位置。根据您的IDE,对项目的引用可能只允许您访问源代码进行编译。

您需要将Java概念与特定于IDE的概念分开。我建议在进入NetBeans之前,先使用文本编辑器和命令shell阅读一个简单的java教程

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

类路径是java的核心概念。必须在运行时向java命令提供包含这些类的所有类或JAR的路径,以便java命令能够加载这些类。对于正在引用但目前未编译的类,还需要在编译时对javac命令执行相同的操作


每当您看到java.lang.ClassNotFoundException时,就意味着在编译代码时出现在类路径上的某个类在启动运行时的类路径中丢失了。

我现在提出的解决方案是:

我希望嵌套库中的引用出现气泡。这显然不适用于类路径。我的结构基本上是:

A指的是B指的是C

当我运行A时,它工作得很好,直到它进入C语言。我所做的是直接引用C语言,将其作为库添加到项目中。从一些快速的谷歌搜索中可以看出,这几乎就是在NetBeans中向项目添加类路径的方式

这对我来说似乎有点混乱,也许有更好的方法,但现在它已经解决了我的问题。感谢所有回答的人——虽然没有人精确地解决了我的特定问题,但你们帮我解决了95%的问题,尽管他们验证了我的想法,并使我能够找出最后一点来继续

Exception in thread "main"
java.lang.NoClassDefFoundError
错误消息中缺少类名,但我们假设它是您希望为其执行main方法的类本身。在这种情况下,这意味着Java无法在运行时类路径中找到特定的类

要解决此问题,您需要cd到类所在包的根目录,然后按如下所示重新执行java命令:

java -cp . com.example.MainClass
这里,-cp参数指定类路径。它只有一个值。这意味着当前工作目录应该被放入类路径中,该类路径通常是def 奥特案,但总比什么都没有好

或者,您可以在-cp参数中指定其完整路径,以便可以在任何地方执行它,例如:

java -cp /path/to/package/root com.example.MainClass
另一种方法是定义一个%CLASSPATH%环境变量,在该变量中,您可以将希望在-cp参数中使用的值精确地输入到该变量中,这在初学者教程中最常见,但专业人士通常不会使用。然后,只要不使用-cp、-classpath或-jar参数之一,java命令就会查找它

如果键入长命令感到厌烦,可以为此使用批处理或shell文件,以便轻松管理

例如,如果您有一个JAR文件或另一个根包文件夹,其中包含您希望在程序中使用的类,那么您需要将它们附加到类路径中。在Windows上,分隔符是分号;在Linux上,分隔符为:。此外,当路径包含空格时,需要引用特定路径。下面是一个Windows示例:

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

希望这有帮助。

谢谢你的帖子。事实证明,这与NetBeans中的引用问题有关。请看我自己对这个问题的回答。我错误地假设一个项目是自包含的——如果它为自己设置了所有引用,那么使用该项目的任何东西都可以引用该项目本身——而不需要引用引用的项目也在使用的所有部分。