Scala jar 读取外部属性文件

11

我已经编写了一些代码并将其导出为一个jar文件。在这个jar文件中有一个名为automation.properties的文件,其中包含我正在使用的默认值。

val automationPropertiesFileURL = getClass.getResource("/automation.properties")  
  if (automationPropertiesFileURL != null) {
    val source = Source.fromURL(automationPropertiesFileURL)
    config = new Properties()
    config.load(source.bufferedReader())
  }

但是,当这个Jar文件作为一个gradle依赖项添加到C:\ User \ abc \ .gradle中时,我想从我的当前项目中读取automation.properties,我该如何覆盖位置并读取项目中的文件而不是来自Jar文件本身?


对于初学者来说,在你的jar包中不要包含默认的属性文件。只需确保在使用jar包时类路径中有一个属性文件即可。 - RaGe
是的,我们也尝试过了,但没有运气。 - Swapnil Kotwal
它被添加为Gradle依赖是什么意思?您将此jar作为其他项目的依赖项添加吗? - Opal
是的,这个jar包不是我的当前项目的一部分。它是一个外部的jar包,添加到了C:\User\<user>\.gradle路径中,并且它会选择相对于该目录的路径。 - Swapnil Kotwal
3个回答

5
类加载器将从它首先找到的位置加载文件。
在您的情况下,该文件存在于两个位置:
- 在当前项目内部 - 在一个jar依赖项内部
类加载器将找到哪个文件取决于“当前项目”和classpath上的jar依赖项的顺序。这就是您需要检查的内容,这是加载正确文件的关键。
您当前的代码是正确的,这只是一个classpath配置问题。

你如何运行你的程序? - janos
通过Eclipse Gradle插件,执行clean build - Swapnil Kotwal
查看类路径设置和依赖项的顺序。使项目本身高于依赖项。 - janos
我没有明白,我的所有 JAR 包都在 C:\User\abc\.gradle 目录中。 - Swapnil Kotwal
当你运行一个Java程序时,使用的库文件列表是在类路径上配置的,可以通过命令行或者jar文件的清单来指定。例如 java -cp lib1.jar:lib2.jar com.example.MyClass。这两个jar文件中都可以存在属性文件,但是类加载器只会找到第一个。通过重新安排类路径,在这个例子中改为 java -cp lib2.jar:lib1.jar com.example.MyClass,会加载不同的文件。你需要找到类路径是如何设置的,并相应地进行调整,以满足你的需求。 - janos

2
Java和Scala读取属性文件的方式不同,其中一篇答案中我解释了在Jar内读取属性文件和在磁盘位置读取属性文件之间的区别。点击这里查看我的答案。
这对Java和Scala都适用!(注意,对于Scala,您可以更改基本语法但概念相同)
希望能帮到您!

先生,您的答案正是我的问题,我曾经问过同样的事情,可惜没有起作用。config = new Properties() config.load(source.bufferedReader()) - Swapnil Kotwal
我的回答是,你可以使用以下代码从任何位置加载属性文件(JAVA):Properties properties = new Properties(); properties.load(new FileInputStream("extenalPropsFileLocation"));其中,“extenalPropsFileLocation”是automation.properties文件的绝对路径。 - Cesar Villasana

2

谢谢@Martijn,但问题在于jar包被添加到了C:\User\abc\.gradle中,因此它总是从该目录搜索相对路径,而不是从我们的项目中搜索。 - Swapnil Kotwal
如果你反编译JAR文件,资源会被放在哪里? - Martijn
在 .jar 文件中,“automation.properties” 文件直接位于根目录下。 - Swapnil Kotwal

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