【问题标题】:Gradle installDist without resource files没有资源文件的 Gradle installDist
【发布时间】:2018-11-12 17:27:17
【问题描述】:

鉴于以下项目设置,运行./gradlew run 通过读取资源文件正确打印出Hello World,但./gradlew installDist && ./build/install/appresourcetest/bin/appresourcetest 没有,因为它找不到资源文件。为什么会这样?如何在继续使用 installDist 任务的同时解决此问题?

由于资源在 jar 中,这可能与 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/main/resources/test.txt

Hello World

/src/main/java/demo/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();

    }
}

【问题讨论】:

    标签: java gradle build.gradle


    【解决方案1】:

    正如this answer 中所述,您不应尝试将test.txt 读取为File,而应使用getResourceAsStream 方法向ClassLoader 请求InputStream。你应该重写你的方法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");

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多