2010-07-05 73 views
1

标题可能不完全清楚,但我会尝试解释。在导出到jar文件的文件路径中使用加号(+)

我试图访问一个像/net/blm50+hmm/synlist/这样的路径的文件,当我不导出到jar文件并在IDE(eclipse)中运行它时,它可以正常工作。但是,如果我在导出它时尝试运行它,则会收到空指针异常。如果我将路径重命名为没有加号,它将毫无问题地运行。我可以逃避加号或类似的东西吗?

你可能会问为什么我不只是重命名文件夹,其原因是懒惰。有很多文件夹要重新命名,我宁愿避免它。

我希望你能帮忙,

shalmon

编辑:

我有我使用的应用程序中的罐子访问资源类文件实用程序:

public class FileUtils { 

public static InputStream getInputStreamForResource(String resourcePath) throws IOException { 
    // Try to get the file from the application jar first. 
    InputStream result = FileUtils.class.getResourceAsStream(resourcePath); 

    return result; 
} 

public static Scanner getScanner(String resourcePath) throws IOException { 
    return new Scanner(getInputStreamForResource(resourcePath)); 
} 

}

如果我打电话getScanner("/net/blm50+hmm/synlist/");我得到nu指针异常。

堆栈跟踪是(调用getScanner在NetworkCollection.fromSynapseList发生):

java.lang.NullPointerException 
    at java.io.Reader.<init>(Reader.java:61) 
    at java.io.InputStreamReader.<init>(InputStreamReader.java:55) 
    at java.util.Scanner.<init>(Scanner.java:590) 
    at persistence.FileUtils.getScanner(FileUtils.java:34) 
    at calculation.NetworkCollection.fromSynapseList(NetworkCollection.java:89) 
    at processes.JobDispatcher.doInBackground(JobDispatcher.java:136) 
    at processes.JobDispatcher.doInBackground(JobDispatcher.java:1) 
    at javax.swing.SwingWorker$1.call(SwingWorker.java:277) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at javax.swing.SwingWorker.run(SwingWorker.java:316) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619) 
+0

你可以发布你的代码和stacktrace的样本吗?点击“编辑”并将其粘贴到那里,预先设置4个空格以自动进行代码格式化 – OscarRyz 2010-07-05 20:46:56

+0

如果您使用没有“+”的文件,会发生什么情况?我认为你应该得到相同的'NullPointerException' – OscarRyz 2010-07-05 21:00:42

+0

如果我尝试访问没有“+”的文件,我没有任何例外。 – ppries 2010-07-05 21:03:07

回答

0

对于代码的工作,jar文件必须是可用到加载文件实用程序的类加载器(或者简单地说,它应该在类路径上)。

+0

你认为他如何在第一位得到例外? – OscarRyz 2010-07-05 21:08:43

+0

它是。我在整个项目中多次使用FileUtils,并且只有当路径中存在“+”时才会出现空指针异常。 – ppries 2010-07-05 21:09:47

+0

@Oscar:你什么意思?资源可以很容易地放在一个不包含正在运行的代码的jar中。 – 2010-07-05 21:13:56

0

once had a problem可能有点相关:当我试图访问一个jar文件中的资源时,我得到了一个异常。一些与Java 1.4.2兼容的代码,但与Java 1.6不兼容。至少我找到了一个解决方法...

打赌这不是一个解决方案,但它可能足够接近,可以为您的问题提供一些帮助。

0

在您的机器上尝试以下操作。

即,创建一个文件绝缘发生故障的代码和与所述输入的一个小的子集进行测试(即只有一个文件,一个用+和一个没有它)

#create two folders: code and code+plus containing one file each 
$ls -l code code+plus/ 
code: 
total 8 
-rw-r--r-- 1 oscarreyes staff 2 Jul 5 18:19 x 

code+plus/: 
total 8 
-rw-r--r-- 1 oscarreyes staff 2 Jul 5 18:18 x 

# create a sample with the code in question 
$cat FileUtils.java 
import java.io.*; 
import java.util.*; 

public class FileUtils { 

    public static InputStream getInputStreamForResource(String resourcePath) throws IOException { 
     // Try to get the file from the application jar first. 
     InputStream result = FileUtils.class.getResourceAsStream(resourcePath); 
     return result; 
    } 

    public static Scanner getScanner(String resourcePath) throws IOException { 
     return new Scanner(getInputStreamForResource(resourcePath)); 
    } 
    public static void main(String [] args) throws IOException { 
     Scanner scanner = getScanner(args[0]); 
     System.out.println(args[0] + " : OK"); 
    } 

} 
#compile it 
$javac FileUtils.java 

# package it with the subfodlers 
$jar -cmf mf f.jar FileUtils.class code+plus/ code 

# execute it without "+" 
$java -jar f.jar /code/x 
/code/x : OK 

#execute it with "+" 
$java -jar f.jar /code+plus/x 
/code+plus/x : OK 

#To get Npe, use a non existing file 
$java -jar f.jar /code+plus/y 

设我知道你是否仍然有问题。

我很确定现在你的问题是在创建jar文件时,你现在包括你认为你包含的“+”文件。

要验证,请运行jar -tf your.jar并查看是否列出了包含+的文件。

+0

我不明白......你批评我的答案,然后在15分钟后发布完全相同的东西? – 2010-07-05 21:28:22

+0

@Mark jejeje可能我不明白,或者你写得不好。您说:*“...该jar文件必须可用于加载FileUtils的ClassLoader”*由于NullPointer是从FileUtil类抛出的,而FileUtil类**是在jar文件内**,那么jar文件已经可用FileUtils类加载器(否则它怎么可能被加载在第一位)也许我们说的是同样的事情,但我没有完全得到你的答案:) – OscarRyz 2010-07-05 21:35:30

+0

@OscarRyz:我的观点是,可能有两个jar文件。仅仅因为(包含FileUtils.class的jar在类路径中)并不意味着包含资源的jar也在类路径中。 – 2010-07-05 21:41:43