在导出到jar文件的文件路径中使用加号(+)

时间:2010-07-05 20:42:13

标签: java jar

标题可能不完全清楚,但我会尝试解释。

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

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

我希望你能提供帮助,

shalmon

编辑:

我有一个类FileUtils,用于访问应用程序jar中的资源:

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/");,我会得到空指针异常。

stacktrace是(对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)

3 个答案:

答案 0 :(得分:0)

要使该代码起作用,jar文件必须可用于加载FileUtils的ClassLoader(或者简单地说,它应该在类路径上)。

答案 1 :(得分:0)

I once had a problem可能与某种程度有关:当我尝试访问jar文件中的资源时,我遇到了异常。一些代码适用于Java 1.4.2但不适用于Java 1.6。至少我发现了一个解决方法......

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

答案 2 :(得分: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并查看是否列出了包含+的文件。