我创建了一个Java程序,将版本管理工具中保存为文件的脚本与数据库中加载的脚本进行比较。这是一个简单的程序,从头到尾运行,并在发现差异时输出到控制台。现在我想从.properties文件加载数据库URL,用户名和密码以及我的文件的位置。
我确实假设如果我把文件放在类路径上,那么我的Java程序就可以看到它:
Properties values = new Properties();
try
{
File checkPackages = new File("myfile.properties");
if(!checkPackages.exists()) throw new FileNotFoundException();
values.load(new FileReader(checkPackages));
}
catch(FileNotFoundException fnfe) {}
我还想将整个程序保存到.jar文件中,以便更有用。不幸的是,我发现引用.properties文件的唯一方法是将它放在我运行java.exe的目录中。 PATH或CLASSPATH似乎不适用??
我发现an Oracle site about the .jar file's Manifest file因为我希望那里有答案,但清单中的Class-path:元素似乎只是引用.jar中不存在的.jar文件(而不是.properties文件!) 问题: 有没有办法将.properties文件包装到.jar文件中,以便我的用户不必知道它在那里? 有没有办法将Oracle驱动程序.jar包装到应用程序的.jar中,这样我的用户就不必知道它在那里(Oracle说它需要'自定义代码')?
TIA
答案 0 :(得分:1)
其中一个appraoch可以使用-D开关在java命令行上定义系统属性。该系统属性可能包含属性文件的路径。
E.g
java -cp ... -Dmyproject.properties = / path / to / my.app.properties my.package.App
获取代码中的属性,如下所述:
String propPath = System.getProperty( "myproject.properties" );
final Properties myProps;
final FileInputStream in = new FileInputStream( propPath );
try
{
myProps = Properties.load( in );
}
finally
{
in.close( );
}
答案 1 :(得分:0)
好吧,我建议用public and private keys加密敏感数据(本例中为用户名,密码,网址)而不是隐藏它。现在不难对任何jar文件(基本上是zip格式)进行收缩并跟踪.properties
文件
答案 2 :(得分:0)
您可以使用ClassLoader#getResource()
和ClassLoader#getResourceAsStream()
方法获取类路径中的资源(即使密封在JAR中)。
例如:
Properties values = new Properties();
values.load(ThisClass.class.getClassLoader().getResourceAsStream("myproject.properties"));
// umm, don't forget to close the stream, this code is just an example usage
请注意,将用户名和密码存储到程序is considered a heavy security risk中的任何数据库。