快哭了,搞3天了,谁有好的解决办法啊。。
最近再做一个swing项目,基本上都做完,马上要给客户使用了。
我把这个项目用exe4j打成了exe文件,由于数据库连接都是写在jdbc.properties里的,boss说客户的数据库和用户名和密码随时更改,需要做个窗口让他们改。于是我写了一个读取和修改jdbc.properties的类,用eclipse执行没任何问题,但是把项目打成jar包,再打成exe文件,就只能读取到jdbc.properties里的信息了,不能修改了。下面是代码
[code=Java]
PropertiesUtil propUtil = new PropertiesUtil();
Properties prop = propUtil.getProperties();
prop.setProperty( "url ", JDBC + upForm.getUrl() + HOST);
prop.setProperty( "username ", upForm.getUsername());
prop.setProperty( "password ", upForm.getPassword());
URL url = this.getClass().getResource(PropertiesUtil.FILEPATH);
OutputStream fos = new BufferedOutputStream(new FileOutputStream(url.getPath()));
prop.store(fos, "url ");
[/code]
接着我又换了一种方法,修改程序打成jar里的文件,这样读取和修改也没问题,最后打成exe程序后,找不到jar的路径,因为jar已经被打成exe了,不知道怎么找到exe里jar的路径。。。
[code=Java]
JarFile jf = new JarFile(System.getProperty( "user.dir ") + "/itgc.jar ");
TreeMap tm = new TreeMap();
Enumeration es = jf.entries();
while (es.hasMoreElements()) {
JarEntry je = (JarEntry) es.nextElement();
byte[] b = getByte(jf.getInputStream(je));
tm.put(je.getName(), b);
}
JarOutputStream out = new JarOutputStream(
new FileOutputStream(file));
[/code]
以上2种办法始终不能解决,我又想把jdbc.properties放在某个盘的文件夹下,然后去读取,不存在的话就在这个盘里自动创建。但是问题又来了,我用的是spring加载 , <context:property-placeholder location= "classpath:jdbc.properties "/>
这里的classpath:jdbc.properties貌似只能加载项目下class文件下的路径。
<context:property-placeholder location= "classpath:c:\data\jdbc.properties "/> 这样是读取不到的。。。
三种方法告破全部失败,这下完了。如果客户安装的数据库和密码和我配置文件里的不一样,他们想改都难。。
不知道诸位有没有做过cs程序,修改exe里的文件方案啊???
------解决方案--------------------哥教你一个绝招,不要用配置文件,用System.setProperty("xxxx_url","");System.setProperty("xxxx_password","");
用的时候System,getProperty取出来
------解决方案--------------------其实问题很简单。如果想客户可以修改某些值。必须有一个外部文件供读取。你目前局限于用固定的方法去读,为什么不尝试自己写个读文件的方法呢。其他参数不管,只要客户想改的地方自己读取,其他的变量仍然用原来的方法就行啊。
------解决方案--------------------你这个设置的值从什么地方读来的呢?
------解决方案--------------------使用 Preferences API (java.util.prefs).
------解决方案--------------------既然是exe文件,读写注册表是最靠谱的。JAVA同样可以访问WINDOWS的注册表
------解决方案--------------------
------解决方案--------------------exe里面的文件不能改吧。。。额。。。这个文件应该直接在外部。。。内部是不可能改得
------解决方案--------------------表示关注
------解决方案--------------------我也来学习了。。
------解决方案--------------------<context:property-placeholder location="file:c:\data\jdbc.properties"/>
------解决方案--------------------把classpath 改为 file
------解决方案--------------------没用过exe4j,只能帮顶了。
------解决方案--------------------来学习的
------解决方案--------------------来学习的
------解决方案--------------------没弄过,帮忙顶
------解决方案--------------------祝你好运了
------解决方案--------------------不放在jar中,放在外面
------解决方案--------------------如果客户修改了,创建一个配置文件。
------解决方案--------------------不要配置文件,每次用的时候,必须输入用户名和密码,即做个登录窗体
------解决方案--------------------LZ写的字太多了,你直接在C盘创建个配置文件就行,通过个窗口读写这个配置文件..........
------解决方案--------------------我想问一下外面有用swing做项目的没???
------解决方案--------------------c:\data\jdbc.properties Java 中的 路径是 / 这个符号或者 \\, 如\\data\\jdbc.properties
------解决方案--------------------用xml作为参数文件,放在用户的某个目录下面,读取和修改不要太方便啊 。
------解决方案--------------------进来学习一下
------解决方案--------------------
properties文件在打包以后,就只能读不能写了,所以LZ需要在用exe4j把jar包打包成exe文件以后就不能反写jar包内部的properties文件了.
我不是很清楚为什么一定要用exe4j将项目打包(可能是为了好看的图标)或者更接近于windows程序,一般来说可以使用外部的properties文件,采用设置环境变量的方式获取它的路径,并进行读写,还是比较推荐用批处理文件来启动程序的方式。
------解决方案--------------------
已经说了读写注册表是唯一靠谱的方法,不懂的别乱叫。我的楼上已经告诉你用什么类读写了,还JNI。
几十楼下来只有一个明白事理的。
------解决方案--------------------
打在包里的文件不能再改了,打包后java文件会被编译,飞java文件会被压缩进去。
这个你可以想想windows的压缩包,在压缩包里的文件你不解压它能打开吗?更别提编辑了。你用exe4j将jar包弄成exe的,当运行的时候应该不会再解压出来吧(像windows的exe安装包一样)。如果要解压出来的话应该不会存在你说的这种情况。要是现你说的功能,只能将这些信息存在数据库,然后给用户提供修改界面。