我一直在不断得到一个我无法理解的NoClassDefFoundError。 我有一个明确的类,因为我可以访问该类中定义的变量。我已经验证该类存在,但是当我尝试调用我需要的函数时,我得到一个NoClassDefFoundError。这是我得到的错误的日志:
[INFO_|08/04 08:18:41|MaintenanceCronReport.main:375] Testing :Test Variable
[ERROR|08/04 08:18:41|Cron$CronJob.run:1423] Exception: [CronMaintenance_1min] org.opengts.scheduler.MaintenanceCronReport.main: -account=ALL -db.sql.provider=mysql -db.sql.host=localhost -db.sql.port=3306 -db.sql.dbname=test -db.sql.user=test -db.sql.password=test -smtp.host=smtp.gmail.com -smtp.port=25 -smtp.user=test@test.com -smtp.user.emailAddress=test@test.com -smtp.password= -smtp.enableSSL=true -sendMail=true -saveOnHD=false -pathToTMP=C:\tmp\ -pathToGTS=C:\Users\User\workspace\GTS\ -emailTo=test@test.com -log.include.date=true [*/1 * * * *] {thread}
java.lang.NoClassDefFoundError: org/opengts/war/report/ReportFactory
at org.opengts.scheduler.MaintenanceCronReport.main(MaintenanceCronReport.java:376)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.opengts.util.MethodAction.invoke(MethodAction.java:389)
at org.opengts.util.MethodAction.invoke(MethodAction.java:372)
at org.opengts.extra.util.Cron$CronJob.run(Cron.java:1420)
at org.opengts.util.ThreadPool$ThreadJob.run(ThreadPool.java:650)
Caused by: java.lang.ClassNotFoundException: org.opengts.war.report.ReportFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 9 more
[INFO_|08/04 08:18:41|Cron$CronJob.run:1426] CronEnd : [CronMaintenance_1min] org.opengts.scheduler.MaintenanceCronReport.main: -account=ALL -db.sql.provider=mysql -db.sql.host=localhost -db.sql.port=3306 -db.sql.dbname=test -db.sql.user=test -db.sql.password=test -smtp.host=smtp.gmail.com -smtp.port=25 -smtp.user=test@test.com -smtp.user.emailAddress=test@test.com -smtp.password= -smtp.enableSSL=true -sendMail=true -saveOnHD=false -pathToTMP=C:\tmp\ -pathToGTS=C:\Users\User\workspace\GTS\ -emailTo=test@test.com -log.include.date=true [*/1 * * * *] {thread}
完整的代码太长了,所以我希望本节能做到。这里我可以正常访问变量TEST_VARIABLE但是尝试在下一行调用静态方法测试会引发上面显示的错误。
Print.logInfo("Testing :" +ReportFactory.TEST_VARIABLE);
Print.logInfo(ReportFactory.test());
变量TEST_VARIABLE和方法测试只是简单地定义为:
public static final String TEST_VARIABLE= "Test Variable";
public static String test()
{
return "TEST METHOD RETURN";
}
感谢任何帮助。先谢谢你。
答案 0 :(得分:1)
见JLS §12.4.1。它部分地说:
类或接口类型T将在紧接之前初始化 第一次出现以下任何一种情况:.....
使用T声明的静态字段,该字段不是常量 变量(§4.12.4)。
请注意,这意味着如果字段不是常量变量,则在首次访问该字段之前将初始化该类。但是,如果字段 是常量变量,则不适用,就像在您的情况下一样。因此,对ReportFactory.test()
的调用可能是§12.4.1适用的第一类访问。这并没有解释为什么你得到异常(你需要检查你的类路径,对于初学者),但它应该有助于解释为什么在成功访问TEST_VARIABLE
之后可能发生这种异常。 / p>
答案 1 :(得分:0)
您的类路径中没有完整的依赖项确保将所有必需的jar放在类路径中。
答案 2 :(得分:0)
我的问题已经解决了。正如所料,事实证明我从类路径中缺少必需的jar文件。感谢所有回复的人。我很感激。