NutzCN Logo
问答 数据库连接配置文件。。。。。
发布于 2563天前 作者 qq_64f81159 2152 次浏览 复制 上一个帖子 下一个帖子
标签:

我现在做了一个CS的小工具,打包成了.jar,因为客户要求可以更改数据库连接,因为jar包中的数据库配置文件是不能修改的,所以我放在了和jar包同级的外面,用

 public static void updateProperties(String keyname,String keyvalue) {   
        try {   
        	System.out.println(System.getProperty("user.dir")+"------------------");
            props.load(new FileInputStream(System.getProperty("user.dir")+profilepath));   
            // 调用 Hashtable 的方法 put,使用 getProperty 方法提供并行性。   
            // 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。   
            OutputStream fos = new FileOutputStream(System.getProperty("user.dir")+profilepath);              
            props.setProperty(keyname, keyvalue);   
            // 以适合使用 load 方法加载到 Properties 表中的格式,   
            // 将此 Properties 表中的属性列表(键和元素对)写入输出流   
            props.store(fos, "Update '" + keyname + "' value");   
        } catch (IOException e) {   
            System.err.println("属性文件更新错误");   
        }   
    }   

这个方法更新数据库配置文件,那我这个dao.js中的conf该怎么写啊 ?conf配置文件如下。。这个paths不知道怎么写。

conf : {
		type : "org.nutz.ioc.impl.PropertiesProxy",
		fields : {
			paths : [ "custom/" ]
		}
	},
	dataSource : {
		factory : "$conf#make",
		args : [ "com.alibaba.druid.pool.DruidDataSource", "db." ],
		type : "com.alibaba.druid.pool.DruidDataSource",
		events : {
			create : "init",
			depose : 'close'
		}
	}
25 回复

在jar文件同级建个custom文件夹就好了

我现在打包成exe了,把ioc文件同级的custom文件夹删除了 ,在和exe同级的目录下加了custom文件夹,可是报错了org.nutz.ioc.IocException: [dao, dataSource] # FAIL to create Ioc Bean name=[dataSource] 但是我的更新方法确实可以更新custom下的db.properties,只是ioc这个读取不到配置文件

换1.r.61试试

貌似还是不行。。

这个不加一些逻辑他怎么判断是在class下搜索还是在user.dir下搜索?

等等,exe?用啥打包成exe了?

exe4j啊 我用fat jar打成jar包也是不能运行啊

顶顶顶。。。。。。。。。

如果把ioc放在jar之外就正常吗?

放到jar之外也不正常啊 这个fields : {paths : [ "custom/" ]}他搜索的是classpath下的路径把 这样直接放在jar外他怎么能知道呢。

不单是classpath,还有当前路径

这个时候js文件应该放在哪里,我是把js文件放到src/main/resources的ioc文件夹下,名称我dao.js,数据库连接是是放到jar包同级目录的custom文件夹下,名称为db.properties,这样不行,只有放在src/main/resources的custom文件夹才不会报错,但是这样打包成jar又没办法修改。

打包后,手动删除之

我测试了一下, 是没有问题的, ioc在jar里面:

// jar内的文件:
org/wendal/nutzmain/Main.class
ioc/dao.js

其中, Main的代码如下:

package net.wendal.nutzmain;

import org.nutz.dao.Dao;
import org.nutz.ioc.Ioc;
import org.nutz.ioc.impl.NutIoc;
import org.nutz.ioc.loader.json.JsonLoader;

public class Main {

    public static void main(String[] args) {
        // 仅做测试
        Ioc ioc = new NutIoc(new JsonLoader("ioc/"));
        ioc.get(Dao.class);
        ioc.depose();
    }
}

使用exe4j生成exe, 选console模式, 64bit模式,启动效果:

17-04-19 14:06:29.756 INFO [main] Select SystemLog as Nutz.Log implement
17-04-19 14:06:29.823 DEBUG [main] Locations count=3 time use 34ms
17-04-19 14:06:29.827 DEBUG [main] Found 1 resource by src( ioc/ ) , regex( ^(.+[.])(js|json)$ )
17-04-19 14:06:29.828 DEBUG [main] loading [dao.js]
17-04-19 14:06:29.874 DEBUG [main] Using 95 castor for Castors
17-04-19 14:06:29.877 DEBUG [main] Loaded 1 bean define from path=[ioc/] --> [dao]
17-04-19 14:06:29.879 INFO [main] NutIoc init begin ...
17-04-19 14:06:29.881 INFO [main] ... NutIoc init complete
17-04-19 14:06:29.884 DEBUG [main] Get 'dao'<interface org.nutz.dao.Dao>
17-04-19 14:06:29.887 DEBUG [main] Load AopConfigure for anno=org.nutz.ioc.aop.Aop by type=org.nutz.ioc.aop.config.impl.AnnotationAopConfigration
17-04-19 14:06:29.888 DEBUG [main]       >> Load definition name=dao
17-04-19 14:06:29.889 DEBUG [main] Loading define for name=dao
17-04-19 14:06:29.892 DEBUG [main] Found IocObject(dao) in JsonLoader(paths=[ioc/])
17-04-19 14:06:29.893 DEBUG [main]       >> Make...'dao'<interface org.nutz.dao.Dao>
17-04-19 14:06:29.903 DEBUG [main] Load class org.nutz.dao.impl.NutDao without AOP
17-04-19 14:06:29.904 DEBUG [main] Save object 'dao' to [app]
17-04-19 14:06:30.005 INFO [main] org.nutz.ioc.impl.NutIoc@885951223 is closing. startup date [17-04-19 14:06:29.879]
17-04-19 14:06:30.006 DEBUG [main] Depose object 'dao' ...
17-04-19 14:06:30.007 INFO [main] org.nutz.ioc.impl.NutIoc@885951223 is deposed. startup date [17-04-19 14:06:29.879]

C:\Program Files\exe4j\bin>

这个没有问题了 但是改写的properties后jdbc:oracle:变成jdbc:oracle:了,然后druid中 判断驱动else if (rawUrl.startsWith("jdbc:oracle:") //
|| rawUrl.startsWith("JDBC:oracle:")) {
return ORACLE_DRIVER;这里就找不到了。。

没看懂这句啥意思

改写的properties后jdbc:oracle:变成jdbc:oracle:了

不是 本来驱动是 jdbc:oracle:thin:@localhost:1521/ORCL 用代码修改这个文件后就变成了 jdbc:oracle:thin:@localhost:1521/ORCL
多了斜杠了,druid里面就会报java.sql.SQLException: unkow jdbc driver : jdbc:oracle:thin:@localhost:1521/ORCL,我进去看了以后是判断的是偶(rawUrl.startsWith("jdbc:oracle:") 这种才能识别。。。

哦,是properties转义的那个问题

PropertiesProxy实例有write方法的,,用它的write,别用Properties类

我试试。。。

貌似没有write方法,传的是一个Writer writer,这个writer怎么写相对jar这个路径。。

还是只能拼凑一个绝对路径出来、

PropertiesProxy 没有write方法。。。

print方法,但有bug, 已fix

添加回复
请先登陆
回到顶部