Gradle installDist без файлов ресурсов - PullRequest
0 голосов
/ 12 ноября 2018

При следующих настройках проекта, ./gradlew run правильно печатает Hello World, читая файл ресурсов, а ./gradlew installDist && ./build/install/appresourcetest/bin/appresourcetest - нет, так как не может найти файл ресурсов. Почему, и как я могу решить эту проблему, продолжая использовать задачу installDist?

Поскольку ресурс находится внутри фляги, это, вероятно, как-то связано с настройкой пути к классам installDist скриптов-обёрток, но на этом мое понимание заканчивается.

/ build.gradle:

plugins {
    id 'java'
    id 'application'
}

group 'com.example.application'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

mainClassName = "demo.Main"

repositories {
    mavenCentral()
}

dependencies {

}

/ settings.gradle:

rootProject.name = 'appresourcetest'

/ SRC / главная / ресурсы / test.txt

Hello World

/ SRC / главная / Java / демо / Main.java

package demo;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Main
{
    public static void main(String[] args) {
        //should not fail:
        String content = getFile("test.txt");
        System.out.println(content);
    }


    //code taken from:
    //https://www.mkyong.com/java/java-read-a-file-from-resources-folder/
    private static String getFile(String fileName) {

        StringBuilder result = new StringBuilder("");

        //Get file from resources folder
        ClassLoader classLoader = Main.class.getClassLoader();
        File file = new File( classLoader.getResource( fileName).getFile());

        try (Scanner scanner = new Scanner( file)) {

            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                result.append(line).append("\n");
            }

            scanner.close();

        } catch ( IOException e) {
            e.printStackTrace();
        }

        return result.toString();

    }
}

1 Ответ

0 голосов
/ 12 ноября 2018

Как объяснено в в этом ответе , вам не следует пытаться прочитать test.txt как File, а попросить InputStream для ClassLoader, используя метод getResourceAsStream. Вам следует переписать ваш метод getFile примерно так:

private static String getFile(String fileName) {
    StringBuilder result = new StringBuilder("");
    try (InputStream in = Main.class.getResourceAsStream(fileName); Scanner scanner = new Scanner(in)) {
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            result.append(line).append("\n");
        }
    } catch (IOException e) {
        // handle exception here
    }
    return result.toString();

}

А также изменить String content = getFile("test.txt"); на String content = getFile("/test.txt");

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