2011-08-23 69 views
1

当我尝试执行此代码时: package uk.org.infectogenomics.agent;从jar加载文件时出现问题(classpath问题)

import uk.org.infectogenomics.Agent.qa.Quasr; 

public static void main(String[] args) { 
//ommited some code 
Runnable step = new Quasr(wf.getStepByPos(1)); 
} 

我得到:

Exception in thread "main" java.lang.NoClassDefFoundError: uk/org/infectogenomic 
s/Agent/qa/Quasr 
at uk.org.infectogenomics.agent.Agent.main(Agent.java:55) 
Caused by: java.lang.ClassNotFoundException: uk.org.infectogenomics.Agent.qa.Quasr 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 1 more 

这里是我的清单文件:

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.2 
Created-By: 1.6.0_25-b06 (Sun Microsystems Inc.) 
Class-Path: lib/mysql-connector-java-5.1.17-bin.jar lib/aws-java-sdk-1.2.6.jar 
X-COMMENT: Main-Class will be added automatically by build 
Main-Class: uk.org.infectogenomics.agent.Agent 

这里是jar文件本身上市:

META-INF/ 
META-INF/MANIFEST.MF 
uk/ 
uk/org/ 
uk/org/infectogenomics/ 
uk/org/infectogenomics/agent/ 
uk/org/infectogenomics/agent/Assembly/ 
uk/org/infectogenomics/agent/hostEl/ 
uk/org/infectogenomics/agent/qa/ 
uk/org/infectogenomics/agent/taxonomy/ 
uk/org/infectogenomics/agent/Agent.class 
uk/org/infectogenomics/agent/Assembly/Newbler.class 
uk/org/infectogenomics/agent/Assembly/Velvet.class 
uk/org/infectogenomics/agent/DBAccessor.class 
uk/org/infectogenomics/agent/DateUtils.class 
uk/org/infectogenomics/agent/Status$1.class 
uk/org/infectogenomics/agent/Status$2.class 
uk/org/infectogenomics/agent/Status$3.class 
uk/org/infectogenomics/agent/Status$4.class 
uk/org/infectogenomics/agent/Status.class 
uk/org/infectogenomics/agent/Workflow.class 
uk/org/infectogenomics/agent/WorkflowStep.class 
uk/org/infectogenomics/agent/agent.properties 
uk/org/infectogenomics/agent/hostEl/Fastq2FQone.class 
uk/org/infectogenomics/agent/hostEl/RepeatMasker.class 
uk/org/infectogenomics/agent/hostEl/SplitFiles.class 
uk/org/infectogenomics/agent/qa/Quasr.class 
uk/org/infectogenomics/agent/taxonomy/Phymbl.class 

那么什么应该是类路径,因为我使用的是Netbe我会认为这是IDE实际处理这件事的工作。只有当我将所有内容都包装在jar中时,才会发生这种情况,当我从IDE运行代码时,一切都按预期工作。

回答

4

看那类名称不能找到:

uk/org/infectogenomics/Agent/qa/Quasr 

现在看看你的jar文件的内容:

uk/org/infectogenomics/agent/qa/Quasr.class 

有一个外壳的区别。我的猜测是在某些时候,您已经从小写切换到软件包名称(它应该是应该是是IMO),但是您在Windows上(不区分大小写的文件系统),所以现有的“代理“目录被保存下来,而不是被擦除,并被”代理“代替。

如果您从头开始重建,它可能会将所有东西排除在外。另一方面,我建议改变软件包名称以遵循常规的Java命名约定。

+0

谢谢!修复它,我一直认为,只是因为Windows是INSENSITIVE的情况下,然后运行它的Java也是。至少这个神话已被揭穿! – LordDoskias

+2

@LordDoskias:直接从文件系统加载类文件时,它是不区分大小写的,这就是之前为您工作的原因。但是jar文件总是区分大小写的。 –