Использование знака плюс (+) в пути к файлу, экспортируемом в файл JAR - PullRequest
1 голос
/ 06 июля 2010

Название может быть не совсем понятным, но я попытаюсь объяснить.

Я пытаюсь получить доступ к файлу с путем, подобным /net/blm50+hmm/synlist/, который прекрасно работает, когда я не экспортирую в файл jar и просто запускаю его изнутри своей среды IDE (eclipse). Однако, если я пытаюсь запустить его после экспорта, я получаю исключение нулевого указателя. Он работает без проблем, если я переименую путь, чтобы в нем не было знака плюс. Могу ли я избежать знака плюс или что-то подобное?

Вы можете спросить, почему я не просто переименую папку, и причина этого в лени. Существует множество папок для переименования, и я бы предпочел избежать этого.

Надеюсь, Вы поможете,

shalmon

EDIT:

У меня есть класс 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/");, я получу исключение нулевого указателя.

Трассировка стека (вызов 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 голосов
/ 06 июля 2010

У меня однажды возникла проблема , которая могла быть как-то связана: я получил исключение, когда попытался получить доступ к ресурсу внутри файла JAR.Некоторый код, который работал с Java 1.4.2, но не с Java 1.6.По крайней мере, я нашел обходной путь ...

Держу пари, что это не решение, но, возможно, оно достаточно близко, чтобы помочь вам с вашей проблемой.

0 голосов
/ 06 июля 2010

Попробуйте следующее на вашей машине.

То есть создайте файл, изолирующий код, который не работает, и протестируйте его с небольшим подмножеством входных данных (это всего один файл, один с + и один без него)

#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 голосов
/ 06 июля 2010

Чтобы этот код работал, файл jar должен быть доступен ClassLoader, который загрузил FileUtils (или просто он должен быть в пути к классам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...