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
}
我有一个用 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:
的 jarURL 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
}