gradle 生成 jar 有资源文件但是 运行 jar 导致资源无效

gradle generate jar has resource file but running jar causes Invalid resource

我有一个用 java 编写的休息服务器,并在构建系统时使用 gradle。

在我的 class 中,我正在使用文件 src/main/resources/myresource.config,如下所示

public static void main(String[] args) {
  String resourcePath = Myapplication.class.getClassLoader().getResource("myresource.config").toURI().getPath();
LOGGER.info(String.format("Loading data from config %s", resourcePath));
BufferedReader br = new BufferedReader(new FileReader(resourcePath));
}

当 运行 直接从命令行或 ide 连接 class 时,程序工作正常。

我正在为我的应用程序构建一个 jar,如下所示

jar {
    manifest {
        attributes 'Main-Class': 'com.example.Myapplication',
                'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
    }

    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
}

jar 成功构建 inside build/libs 当我尝试 运行ning jar java -jar myapplication.jar 我找不到 myresource.config 资源。

我解压缩构建 jar,发现 myresource.config 文件存在,但 jar 无法 运行.

到目前为止我已经尝试过的事情

ClassLoader.getSystemClassLoader().getResource("myresource.config");
Thread.currentThread().getContextClassLoader().getResource("myresource.config")

谁能指出我做错了什么?

堆栈跟踪

INFO: Loading data from config null
Invalid resource: myresource.config
java.lang.NullPointerException
    at java.io.FileInputStream.<init>(FileInputStream.java:130)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at java.io.FileReader.<init>(FileReader.java:58)
    at com.example.Myapplication.<main>(Myapplication.java:26)

我认为你必须改用 getResourceAsStream。
Myapplication.class.getResourceAsStream("myresource.config")

问题在于,当 运行 来自 IDE myresource.config 的应用程序直接从文件系统读取时。那就是你得到一个常规文件 URL:

URL configUrl = Myapplication.class.getClassLoader().getResource("myresource.config");
// returns "file:/C:/path/to/project/bin/main/myresource.config"

但是当您从 jar 文件执行应用程序时,将从 jar 中读取配置文件,您会得到一个基于 URL:

的 jar
URL configUrl = Myapplication.class.getClassLoader().getResource("myresource.config");
// returns "jar:file:/C:/path/to/project/build/libs/myapplication.jar!/myresource.config"

第二个基于 jar 的 URL 无法转换为文件系统路径,这就是为什么您得到 null.

要在这两种情况下获取配置,您应该这样做

try (final InputStream configInputStream = Myapplication.class.getClassLoader().getResourceAsStream("myresource.config");
     final BufferedReader br = new BufferedReader(new InputStreamReader(configInputStream));) {
   // do something with br
}