2013-08-06 31 views
0

为什么以下iniciation在eclipse工程:JAVA - 路径问题(在Eclipse的作品,而不是在CMD)

private static MaxentTagger maxentTagger = new MaxentTagger("c:\\DP\\lemma\\models\\english-left3words-distsim.tagger"); 

但在命令行它抛出:对应与MaxentTagger iniciation

java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa 
der.java:58) 
Caused by: java.lang.ExceptionInInitializerError 
     at dp.beans.MySearch.<init>(MySearch.java:122) 
     at dp.runable.Main.main(Main.java:25) 
     ... 5 more 
Caused by: java.lang.IllegalArgumentException: name 
     at sun.misc.URLClassPath$Loader.findResource(Unknown Source) 
     at sun.misc.URLClassPath.findResource(Unknown Source) 
     at java.net.URLClassLoader$2.run(Unknown Source) 
     at java.net.URLClassLoader$2.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findResource(Unknown Source) 
     at java.lang.ClassLoader.getResource(Unknown Source) 
     at java.net.URLClassLoader.getResourceAsStream(Unknown Source) 
     at edu.stanford.nlp.io.IOUtils.findStreamInClasspathOrFileSystem(IOUtils.java:370) 
     at edu.stanford.nlp.io.IOUtils.getInputStreamFromURLOrClasspathOrFileSystem(IOUtils.java:399) 
     at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:646) 
     at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:284) 
     at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:248) 
     at dp.data.Settings.<clinit>(Settings.java:80) 
     ... 7 more 

Settings.java:80 ..

是否有不同的方式来声明窗口路径,它在eclipse和cmd都起作用?

更新(该findStreamInClasspathOrFileSystem法):

private static InputStream [More ...] findStreamInClasspathOrFileSystem(String name) throws FileNotFoundException 
{ 
    String path = null; 
    if (name.startsWith("/")) { 
    path = name.substring(1); 
    } 

    // - even though this may look like a regular file, it may be a path inside a jar in the CLASSPATH 
    // - check for this first. This takes precedence over the file system. 
    InputStream is = null; 
    if (path != null) { 
    is = IOUtils.class.getClassLoader().getResourceAsStream(path); 

    // windows File.separator is \, but getting resources only works with/
    if (is == null) { 
     is = IOUtils.class.getClassLoader().getResourceAsStream(path.replaceAll("\\\\", "/")); 
    } 
    } 

    // if not found in the CLASSPATH, load from the file system 
    if (is == null) is = new FileInputStream(name); 
    return is; 
} 

更新:不管我改变路径:

"c:/DP/lemma/models/english-left3words-distsim.tagger"); 
    "c:\\\\DP\\\\lemma\\\\models\\\\english-left3words-distsim.tagger"); 

其行为仍然是相同的(在eclipce作品,而不是cmd)

+0

可能的重复:http://stackoverflow.com/questions/2030434/eclipse-no-java-jre-jdk-no-virtual-machine –

+0

没有完整的代码是不可能的,但这条线似乎是第一个嫌疑人:'IOUtils.getInputStreamFromURLOrClasspathOrFileSystem'。它不能正确识别这是一个文件,并尝试从类路径加载它失败 –

+0

而我忘了告诉你,它运行在Windows 7 64位 – gaffcz

回答

3

你的代码似乎从classath中加载资源,使用类加载器。路径应采取以下形式:

com/yourcompany/yourapp/english-left3words-distsim.tagger 

其中com.yourcompany.yourapp是文件所在的包。

参见http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource%28java.lang.String%29

编辑:

IOUtils.getInputStreamFromURLOrClasspathOrFileSystem()的代码传递两个格式错误的路径(c:\...c:/...)至ClassLoader.getResourceAsStream(),并期望该方法简单地返回null抛出异常,而不是,这是错误的。我会简单地决定我要加载资源的位置:类路径(因此使用ClassLosader.getResourceAsStream())或文件系统(因此使用new FileInputStream())。

+0

谢谢。但我认为我不了解你。为什么它看起来像claspath,如果绝对路径被指定?不能是路径字符串的sysntax中的问题? – gaffcz

+0

可能是因为edu.stanford.nlp.io.IOUtils.getInputStreamFromURLOrClasspathOrFileSystem()是buggy。我将决定你真正想要加载资源的位置,并直接从那里获取:无论是类路径还是文件系统。 –

+0

我已经更新了我的'findStreamInClasspathOrFileSystem()'方法的问题.. – gaffcz