从Java访问gradle资源

19

我有一个基于Gradle的Java项目,具有以下结构

.
├── myproject
│      ├── src
│      |    └── main
│      |         ├── java
│      |         └── resources
│      |               └── myresource.xml
|      ├── build
|      |     ├── classes
|      |     |    └── main
│      |     |         └── myresource.xml
|      |     ├── resources

我正在尝试使用类加载器来访问资源文件夹中的一些文件,就像这样:

ClassLoader.getSystemClassLoader().getResoure("/myresource.xml");

但它找不到这个文件。

我发现访问这些文件的唯一方法是探索该项目的已知结构。

Path resourcesPath= FileSystems.getDefault().getPath(System.getProperty("user.dir"), "/src/main/resources/");

有什么想法我做错了什么吗?

4个回答

21

好的,似乎我的问题来自另一个问题(资源未被复制到正确的位置)。一旦我解决了这个问题,ClassLoader就能够使用以下两种形式找到我的资源:

ClassLoader.getSystemClassLoader().getResource("./myresource.xml");

ClassLoader.getSystemClassLoader().getResource("myresource.xml");

编辑:当将该jar文件嵌入到其他应用程序中时,前面的解决方法将不起作用,在这种情况下,请使用以下方法:


Thread.currentThread().getContextClassLoader().getResource("myresource.xml")

当你尝试从一个jar文件加载资源时,它无法工作。请参考https://discuss.gradle.org/t/how-can-i-read-setup-resources-from-plugin-jar/13274/2。 - Adrian Bartyczak

2

我已经修改了原始问题以便澄清和更好地理解。 - magomar
类存储在与资源相同的位置。 - Dmitry Ginzburg
你说得对 @DmitryGinzburg,我的困难是由于资源没有复制到类文件夹中,这是与我IDE中gradle的使用或配置有关的问题,我猜(我是gradle的新手)。 - magomar

0

在Gradle中使用Groovy访问Java资源的另一种解决方案是,例如读取Java资源中的VERSION文件:

static String getVersion(File rootFile)  {
    File versionFile = new File(rootFile, "src/main/resources/VERSION")
    byte[] versionBytes = Files.readAllBytes(versionFile.toPath())
    String version = new String(versionBytes, StandardCharsets.UTF_8).trim()
    version
}

version = getVersion(project.projectDir)

它避免操作 ClassLoader

注意:在任务的函数中,sourceSets.main.output.resourcesDir 尚不存在。


0

也许你应该这样使用它:


Thread.currentThread().getContextClassLoader().getResource("myresource.xml")

如果我使用 ClassLoader.getSystemClassLoader().getResource("myresource.xml")

当我将其作为嵌入到其他应用程序的jar包中时,我仍然无法访问资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接