Мой исполняемый файл jar не может открыть файлы ресурсов, когда я запускаю его за пределами NetBeans - PullRequest
0 голосов
/ 20 февраля 2020

первый пост здесь, надеюсь, я правильно сформулировал этот вопрос. Мой проект находит файлы ресурсов в classpath при запуске внутри netbeans как проект, но когда я запускаю jar вне netbeans, он не может найти ресурсы (я проверил, и да, они помещаются в jar. )

Я пробовал как .getResource (), так и версию .getResourceAsStream () моего кода. Они оба успешно выполняются при запуске внутри netbeans как проект maven, но эти ресурсы не обнаруживаются, когда я удаляю jar и запускаю его вне netbeans.

Вот фрагмент моего кода, а также фрагмент из моего файла POM, где я добавляю ресурсы. Все работает, когда запускается как проект внутри netbeans, но не когда я запускаю jar в другом месте. Не удается найти ресурсы.

... ...

    String wholeFile = "";
    try {

       BufferedReader objReader = new BufferedReader(
                new java.io.InputStreamReader(
                        getClass().getResourceAsStream( sqlFileName ) 
            )
        );

        StringBuilder sb = new StringBuilder();
        String strCurrentLine;
        while ( (strCurrentLine = objReader.readLine()) != null ) {
            sb.append( strCurrentLine );
            sb.append( System.getProperty("line.separator") );
        }
        wholeFile = sb.toString();

... или, предпочтительно ...

        wholeFile = java.nio.file.Files.readString(
            java.nio.file.Paths.get( 
                getClass().getClassLoader().getResource( sqlFileName ).toURI()
            ) 
        );


    // Split that file into individual create
    // table strings contained in the file.

    // Slit on two newlines.
        String newLine = System.getProperty("line.separator");
        String[] tables = wholeFile.split( newLine + newLine );

.... ..

А вот что я добавил в пом. Но это решает только если запустить в NetBeans. Почему? Чего мне не хватает в настройке maven здесь? За пределами netbeans ... исполняемый файл jar не найдет эти файлы ресурсов, как они делают при запуске внутри netbeans.

Заранее спасибо. Я надеюсь, что мой вопрос был ясен.

<resources>
    <resource>
        <directory>src/my-resources</directory>
            <includes>
                <include>**/*.txt</include>
                <include>**/*.jpg</include>
            </includes>
    </resource>
</resources>

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020
            StringBuilder sb = new StringBuilder();
            InputStream stream = getClass().getResourceAsStream( sqlFileName );
            Scanner in=new java.util.Scanner(stream);
            while (in.hasNextLine())
            {
                    //System.out.println(in.nextLine());
                    sb.append( in.nextLine() );
                    sb.append( System.getProperty("line.separator") );
            }
            in.close();
            wholeFile = sb.toString();

Большое спасибо, что исправили это. Было что-то особенное в использовании только прямого InputStream здесь. Ваш код сработал.

Работает сейчас ... и за пределами netbeans. Большое спасибо!

0 голосов
/ 20 февраля 2020

java.nio.file.Files не могу прочитать содержимое файлов * .jar, насколько я знаю. Вам необходимо получить доступ к ресурсу через загрузчик классов в виде потока. Поэтому я думаю, что ваша первая попытка должна быть в порядке.

Возможно, это просто вопрос пути. Вот рабочий пример без Maven:

Файл src / de / stefanfrings / Main. java:

package de.stefanfrings;

import java.io.InputStream;
import java.util.*;

public class Main
{
    public static void main(String[] args)
    {
        InputStream stream=Main.class.getResourceAsStream("/test.txt");
        Scanner in=new Scanner(stream);
        while (in.hasNextLine())
        {
            System.out.println(in.nextLine());
        }
        in.close();
    }
}

Файл src / de / test.txt:

Hello
World

Содержимое файла test.jar:

META-INF/MANIFEST.MF
test.txt
de/stefanfrings/Main.class

Вывод:

java -jar test.jar
Hello
World

Если я изменю имя файла на "../../test.txt", тогда оно будет работать только в IDE, потому что IDE выполняет программу из (несжатой) папки, в которую компилятор помещает свои выходные данные.

Попробуйте добавить к имени файла префикс "/".

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