0

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

4

1 回答 1

0

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

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

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

我想为Groovy做一个快速插件,作为一种脚本语言,它可以让您完全访问 Java 库(尤其是通过它的@Grab注释)。

于 2013-07-12T02:01:45.360 回答