我正在研究Jeff Langr撰写的《 Agile Java》一书,并设置了一个批处理文件(run.bat)来编译和运行我的类。随着更多程序包的引入,我刚刚更改了文件结构,并且感觉好像我理解了类路径,但是我尝试进行的一项调整无法按我期望的方式工作。

可以使用以下批处理文件进行编译并正常运行:

@echo off
javac -classpath C:\junit3.8.1.jar;C:\AgileJava\Lessons studentinfo\*.java reports\*.java
if not errorlevel 1 java -cp C:\junit3.8.1.jar;C:\AgileJava\Lessons junit.awtui.TestRunner sis.studentinfo.AllTests


我试图做最后一条语句,如下所示(将\ sis添加到类路径中,并从studentinfo.AllTests中删除对sis的引用):

if not errorlevel 1 java -cp C:\junit3.8.1.jar;C:\AgileJava\Lessons\sis junit.awtui.TestRunner studentinfo.AllTests


但是出现以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: studentinfo/AllTests (wrong name: sis/studentinfo/AllTests)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at junit.runner.TestCaseClassLoader.loadClass(TestCaseClassLoader.java:104)
        at junit.runner.ReloadingTestSuiteLoader.load(ReloadingTestSuiteLoader.java:9)
        at junit.runner.BaseTestRunner.loadSuiteClass(BaseTestRunner.java:193)
        at junit.runner.BaseTestRunner.getTest(BaseTestRunner.java:86)
        at junit.awtui.TestRunner.runSuite(TestRunner.java:455)
        at junit.awtui.TestRunner.start(TestRunner.java:536)
        at junit.awtui.TestRunner.main(TestRunner.java:382)


谁能解释为什么?我知道这是因为它没有找到AllTests类,但是我看不到如何将其实现。

最佳答案

您正在向junit.awtui.TestRunner传递一个类的名称,该类应该在其中找到一些测试。

您需要传递“完全限定的类名”,即在其中声明一个类的包,后跟其类名。
在编写类AllTests时,您指定了它所在的包。看起来您指定它在sis.studentinfo中,这意味着标准名称为sis.studentinfo.AllTests。名称studentinfo.AllTests指的是一个不同的类,该类显然不存在。

请注意,当您指定类路径时,您只是在指定Java将在哪些目录(和/或归档文件)中查找类-它不会改变您对类的引用方式-类名与类路径无关。

07-27 23:50