我的计算机上有一个脚本,它根据我键入的命令运行其他脚本。这些任务经常完成,通常只需要一些参数(比如更新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只会运行一个命令,所以为什么只有一个命令会注册所有命令(并加载)所有命令使用,然后程序退出?另外,我希望它是动态的。
答案 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
注释)。