从类路径中读取属性文件(非 Maven)

Read properties file from classpath (non-maven)

当我尝试从另一个目录 运行 我的 jar 时,它看不到带有“url.properties”文件的“config”文件夹。

在 MyProperties 中 class 我有以下代码,当来自同一目录 运行 时 运行 完美 :

Properties properties = new Properties();
FileInputStream in = new FileInputStream("./config/url.properties");
properties.load(new InputStreamReader(in, Charset.forName("UTF-8")));
in.close();

包含此代码的 class 在以下树中:

myproject\MyAppClass.class
myproject\data\MyProperties.class

运行 如果我 运行 这个包含上述代码的 jar 通过执行以下操作就可以了:

C:\myjarfolder\>java -jar myApp.jar

但是它在“配置”中找不到“url.properties”,如果我这样做,return就会出错:

C:\>java -jar c:\myjarfolder\myApp.jar

显然这似乎是一个 class 路径问题,所以我尝试了以下但没有成功并且 return 同样的“找不到文件”错误:

C:\> java -cp "c:\myjarfolder\*;c:\myjarfolder\config" myproject.MyAppClass
C:\> java -cp "c:\myjarfolder\*;c:\myjarfolder\config\" myproject.MyAppClass
C:\> java -cp "c:\myjarfolder\*;config" myproject.MyAppClass
C:\> java -cp "c:\myjarfolder\*;config\" myproject.MyAppClass
C:\> java -cp "c:\myjarfolder\*;\config\" myproject.MyAppClass
C:\> java -cp "c:\myjarfolder\*;c:\myjarfolder\config\url.properties" myproject.MyAppClass 

以及许多其他带引号和不带引号的变体,都没有成功。


然后我认为这可能是加载资源的问题并尝试更改 InputStream(它在静态方法中):

Properties properties = new Properties();
properties.load(MyProperties.class.getClassLoader().getResourceAsStream("./config/url.properties"));

and then

properties.load(MyProperties.class.getClassLoader().getResourceAsStream("config/url.properties"));

即使 运行在同一个文件夹中,这种方式也不起作用。


我还尝试将配置文件夹放在 class-path: inside manifest 中。没用。


我尝试了很多我在堆栈上找到的东西,none 似乎有效。

有没有办法从另一个目录将第一个选项(没有 getresources)设置为 运行?

如果我以某种方式让它从 getResource 加载,如果我引用 class 路径,它会从另一个目录 运行 加载吗?

当使用像 FileInputStream("./config/url.properties") 这样的绝对位置时:

在jar 中添加config 文件夹。从 IDE 您可以将其添加为源,它会自动编译 jar 中的文件夹。然后它可以是 运行 和来自另一个文件夹的“java -jar c:\myjarfolder\myJar.jar”没问题。


当使用 getResources("url.properties") 时:

这里不能使用绝对位置否则会和以前一样的问题,所以要让jar外的文件夹添加到class路径中(你可能不会运行 它来自 IDE 如果没有添加到 运行 参数 class 路径或清单)。 可以通过 运行 像这样添加文件夹:
'java -cp "c:\myjarfolder*;c:\myjarfolder\config" myproject.MyAppClass'

也可以添加到MANIFEST.MF class-path,例如“class-path:config/”。 (它只在这里与“/”一起工作)并且可以是 运行 与“java -jar c:\myjarfolder\myJar.jar”.


我认为这不是人们会遇到的正常问题,因为通常您 运行 罐子来自相同的位置。但是我们正在从服务器创建一个到 运行 的 RDP,它不能 运行 自己的 jar,而是使用 java.exe.