Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类没有正确加载?_Java_Classloader - Fatal编程技术网

Java 类没有正确加载?

Java 类没有正确加载?,java,classloader,Java,Classloader,我的计算机上有一个脚本,根据我键入的命令运行其他脚本。这些任务经常执行,通常只需要几个参数(比如更新git存储库)。这是使用bash脚本完成的,但是我想增加更多的灵活性,所以我将它转换为Java 有一个单独的文件用于“注册”这些命令。我使用以下语法: 名称、别名1、别名2,。。。(一个或多个选项卡)path.to.main.class 键入命令时,is将搜索此文件以查找要加载的正确类路径 name是用于输出和查找适当jar的命令(以及jar)的名称。然后使用path.to.main.class加

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

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

名称、别名1、别名2,。。。(一个或多个选项卡)path.to.main.class

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

name
是用于输出和查找适当jar的命令(以及jar)的名称。然后使用
path.to.main.class
加载该类。因为该类
扩展了我创建的一个抽象类,所以我随后强制转换并调用了一个名为
onCommandRun
的方法,这是不言自明的

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

我的问题是,jar的主类可以正常加载,但是当我使用它需要运行的另外两个实用程序类中的一个时,我会得到一个
NoClassDefFoundError
/
ClassNotFoundException

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

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


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

我假设您的主脚本(通过名称和别名到Java完全限定类名的映射读取文件的脚本)有一行代码,类似于:

java -cp "/path/to/main.jar:/path/to/specificCommand.jar" com.example.MainClass
我猜类路径(由
-cp
定义)目前只有特定命令的jar文件。但是,特定命令的jar文件不会自动加载到包含抽象类(以及其中任何其他通用类)的主jar文件中。您需要确保包含所需任何类的jar文件都在
-cp
参数中指定


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

为什么要注册所有命令?因为按自己的方式进行操作不会节省任何时间,而且动态加载很难(正如您所看到的)。另外,为什么要选择Java而不是Bash来完成此任务?这似乎是在发明Bash函数。如果你真的想这样做,但是,请包括一些相关的代码。(如何装入罐子、完整堆栈跟踪以及它指向的位置等)我的回答有用吗?