2013-05-19 40 views
7

我写了一个小应用程序。我已将特定于数据库的信息放入属性文件中。包含带有Jar文件的属性文件

db.url=jdbc:mysql://localhost:3306/librarydb 
db.user=root 
db.passwd=pas$w0rd 

当我构建应用程序来获取可执行jar文件时,属性文件被包含在里面。把这些信息放在一个属性文件中的目的是为了让用户改变这些信息,但这使得它变得不可能。

如何在jar文件中不包含属性文件?有点像在.NET应用程序中使用AppSettings文件。

我对Java非常陌生,所以如果能将它分解为一组步骤,我会很感激。

谢谢。

编辑:

这是我应得的值从属性在我的程序文件。

public class DatabaseHandler { 

    public static Connection connectToDb() { 
     Connection con = null; 
     Properties props = new Properties(); 
     InputStream in = null; 

     try { 
      in = DatabaseHandler.class.getResourceAsStream("database.properties"); 
      props.load(in); 
      in.close(); 

      String url = props.getProperty("db.url"); 
      String user = props.getProperty("db.user"); 
      String password = props.getProperty("db.passwd"); 

      con = DriverManager.getConnection(url, user, password); 
     } catch (Exception ex) {   
      Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex); 
     } 
      return con; 
    } 

} 
+0

这不是我清楚你的意思是什么“我怎么能包括的属性有没有在它的jar文件文件” - 只是不把属性文件放在jar文件中...... –

+0

嗯......我能给出的最接近的例子是.NET中的App.config文件。当可执行文件被创建时,文件与它捆绑在一起,对吧?不在里面。 – Isuru

+0

当然。所以现在你已经提供了代码,我们可以看到你需要做什么 - 只需使用'FileInputStream'而不是'getResourceAsStream'。 –

回答

0

不要硬编码属性文件的位置。你的方法应该是从classpath中传输文件。

如果不是,最好的方法是指向一个URL,它以特定的数据格式(比如JSON)返回属性信息。

如果你有JAR检查this出来。

如果您的应用程序是WAR检查properties in WAR

2

您可以改为从类路径加载属性文件。这使您可以捆绑jar中的属性文件,而且还可以在之外的罐子中。它只需要在正在运行的应用程序的类路径上。

您可以通过以下方式做到这一点:

Properties props = new Properties(); 
InputStream inputStream = this.getClass().getClassLoader() 
     .getResourceAsStream(propFileName); 

props.load(inputStream); 
+0

因此,如果我只是把属性文件放在可执行jar文件所在的文件夹中,它会工作吗? (我也编辑了这个问题,把我用来检索属性文件中的值的代码) – Isuru

6

你是对的。如果属性旨在为用户修改,然后把它们放在一个属性的JAR文件是行不通的

有几个办法:

  • 你可以把属性在您存储在文件系统中的属性文件中。问题是找出其中在文件系统中存储它们:

    • 在Unix/Linux存在用于在哪里存储系统范围和每用户配置属性约定,但这些都有点松动,并在一个不活跃的状态(例如,某些“桌面”框架有自己的偏好机制。

    • 我相信Windows也有类似的约定。

    • 方法的问题可能是权限问题(您不希望一个用户更改其他用户的首选项),甚至可能出现只读文件系统等问题。

    • 如果您要在文件系统中使用属性文件,将位置硬连线到您的代码中是一个坏主意。通过命令行参数和/或可以使用-D选项设置的“系统属性”进行配置。

  • 在Windows上,您可以将属性放到Windows注册表中。但是你需要使用第三方库来做到这一点。当然,这不是便携式的 - 它不适用于非Windows平台。您可以使用Java Preferences API。这是跨多个平台移植的,但它是以Java为中心的解决方案;即它不适合平台的做法“正常方式”。

简而言之,从各个角度都没有理想的解决方案。


但是,一旦你决定如何存储你的喜好,你可以您的应用程序,以便它使用的属性在你的JAR文件的文件提供默认或初始设置。的

2

代替

in = DatabaseHandler.class.getResourceAsStream("database.properties"); 

尝试

in = DatabaseHandler.class.getResourceAsStream("/database.properties"); 
相关问题