【问题标题】:Running Java program from Python从 Python 运行 Java 程序
【发布时间】:2011-01-08 10:06:52
【问题描述】:

我看过herehereherehere

虽然信息量很大,但它们并不足以让我发现问题的根源。我的代码不包含在 JAR 文件中,并且客户要求我们不要这样发货。

我在 Eclipse 中构建了应用程序,然后它运行良好。我已经设置了一个脚本,该脚本将修改其中一个 java 文件的 main 方法以进行测试。我想在修改后使用来自 Python 的调用来运行应用程序。但是,当我尝试使用javajava -cp . 调用程序时,从命令行出现以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: DemoAPIFunctionality
Caused by: java.lang.ClassNotFoundException: DemoAPIFunctionality
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: DemoAPIFunctionality.  Program will exit.

我的项目依赖于几个不在根目录中的 JAR 和一个 DLL 文件,同样不在根目录中。我希望它与其中一个的位置有关,但我不确定并且进展甚微。这里是DemoAPIFunctionality.java

public class DemoAPIFunctionality
{
  public final static void main(String[] args)
  {
    DemoAPIFunctionality demo = new DemoAPIFunctionality();

如果对您有所帮助,我很乐意列出更多信息。 (不,我不是体育经纪人。)我需要做些什么才能让它至少从命令行工作?

提前致谢。

【问题讨论】:

  • DemoAPIFunctionality 在包中吗? (如果您可以显示完整的源代码,那将有所帮助。)您的目录和文件结构是什么? .class 文件位于何处?

标签: java command-line classnotfound


【解决方案1】:
  1. 不鼓励在默认包中包含类(即没有包)
  2. 你必须从你的项目的根目录调用java -cp .——即你的.class文件所在的目录,或者当你创建包时,comorg等)子目录所在的目录居住。
  3. 你必须用它的全名来引用这个类 - 即com.package.ClassName
  4. 您最好使用 IDE - 出于教育目的,有 BlueJ 和 JCreator。 Eclipse 和 NetBeans 更加强大和复杂。

【讨论】:

  • 1.是的,是的,坏我。改变它会解决它吗? 2. 我做到了。 3. 见 1 4. 在 IDE 中构建时,他们不希望使用 IDE 进行演示。它应该显示它可以使用脚本按原样进行测试。
【解决方案2】:

您没有提到您的 python 脚本在应用编辑后实际上编译了 java 源文件。

Eclipse 将自动编译它(内置构建器),但当然,在 IDE 之外,您必须先调用 javac,然后才能执行该类。 java 不适用于源文件。

编辑

我不知道你在 java 方面的实际经验——但这就是它通常在命令行上的工作方式。

假设,你有一个 java 类 com.example.Hello,它有一个 main 方法和一个类似的文件结构

/dev/bin/com/example/Hello.class

然后你 cd/dev/bin 并做一个 java com.example.Hello。请注意,包名 (com.example) 始终映射到文件夹结构 (com/example)。如果执行上述命令,java在./com/example文件夹中找不到Hello.class,则会抛出NoClassDefFoundError

【讨论】:

  • 你说的太对了。但是,错误仍然存​​在。我现在正在从命令行使用 Eclipse 编译的代码,并且正在发生同样的事情。
  • 奇怪。请仔细检查,当执行命令 java DemoAPIFunctionality 时,您确实在项目的 bin 文件夹中,而不是在项目或 src 文件夹中(假设您有一个典型的 eclipse 项目文件夹结构与 project/src对于源代码和project/bin 对于类文件)
  • 是的,我在 bin 目录而不是 src。这就是为什么我包含有关在 bin 目录树中找不到的其他 JAR 依赖项和 DLL 依赖项的花絮。
  • 该死的。我会继续努力的。这一定很简单,但是由于您在 java 之前指出了 javac 的问题,因此您得到了赞誉。那最终也会让我绊倒。
【解决方案3】:

简单的解决方法、提示和快捷方式。 在 python 中调用java classname 时不要使用任何路径。 例如。 commands.getstatusoutput("java -cp $CLASSPATH clusterize")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多