课程没有正确加载?

时间:2013-07-08 02:24:14

标签: java classloader

我的计算机上有一个脚本,它根据我键入的命令运行其他脚本。这些任务经常完成,通常只需要一些参数(比如更新git存储库)。这是使用bash脚本完成的,但我想增加更多的灵活性,所以我将它转换为Java。

有一个单独的文件用于“注册”这些命令。我使用以下语法:

name, alias1, alias2,... (one or more tabs) path.to.main.class

当键入命令时,将搜索此文件以查找要加载的正确类路径。

name是用于输出和查找相应jar的命令(以及jar)的名称。然后使用path.to.main.class加载该类。因为那个类extends是我创建的一个抽象类,所以我然后编译并调用一个名为onCommandRun的方法,不言自明。

每个命令都导出到一个jar,尽管大多数只需要一个类文件来运行。有一个命令需要三个类(虽然我可能只是把它们放在同一个类中,但我不喜欢内部类)。

我的问题是,该jar的主要类加载正常,但是当我使用其他两个实用程序类中的一个时,它需要运行,我得到NoClassDefFoundError / ClassNotFoundxception

根据我的理解,JVM在需要时加载所需的类,那么为什么加载其他类时会遇到问题呢?

额外:每个'命令jar'都在一个单独的文件夹中,而不是控制所有内容的主jar。

额外#2:将每个命令分成它自己的jar的原因是因为控制一切的主jar只会运行一个命令,所以为什么只有一个命令会注册所有命令(并加载)所有命令使用,然后程序退出?另外,我希望它是动态的。

1 个答案:

答案 0 :(得分:0)

我假设您的主脚本(使用从名称和别名到Java完全限定类名称的映射读取文件的主脚本)具有类似于以下内容的行:

java -cp "/path/to/main.jar:/path/to/specificCommand.jar" com.example.MainClass

我猜测类路径(由-cp定义)目前只有特定命令的jar文件。但是,特定命令的jar文件不会自动加载到包含您的抽象类的主jar文件中(以及您在其中的任何其他常规类)。您需要在-cp参数中指定包含所需类的jar文件。

我希望快速插入Groovy作为脚本语言,使您可以完全访问Java库(特别是通过它的@Grab注释)。