0

为什么以下起始在 Eclipse 中有效:

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

但在命令行中它抛出:

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:80MaxentTagger启蒙相对应..

是否有不同的方法来声明 Windows 路径,它适用于 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 中)

4

1 回答 1

3

您的代码似乎使用 ClassLoader 从 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 而不是抛出异常,这是错误的。我会简单地决定我想在哪里加载资源 rom:类路径(因此使用ClassLosader.getResourceAsStream())或文件系统(因此使用new FileInputStream())。

于 2013-08-06T06:51:14.023 回答