NutzBoot官方生成的依赖jetty启动,调试运行没有问题,但不知道如何打包发布,很头疼,请问有没有相关文档,MAC系统,貌似没有安装maven之类的工具
谢谢,编译通过,可以正常使用!
但是遇到一个新问题,我将配置文件打包到jar包外面
有application.properties log4.properties
现在application.properties修改后可以生效,但是log4.properties修改不生效,怀疑是读取到jar包里面的配置文件了,我编译器修改了pom.xml文件
build节点新增了:
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*</exclude>
</excludes>
<filtering>true</filtering>
</resource>
</resources>
plugins节点新增了
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<outputDirectory>
${project.build.directory}
</outputDirectory> <!-- 表示把配置文件拷到和jar包同一个路径下 -->
<resources>
<resource>
<directory>src/main/resources/</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
我测试的方式很简单
1、将application.properties的jetty.port更换端口,重启jar可以立即生效
2、将log4.properties的logger等级修改为info,重启后依然有debug日志
强烈建议在NutzBoot官网生成项目是新增resource目录与lib目录打包在项目外的选项就真心方便了,这样以后发布就不用修改配置文件,或者修改文件不用发布,还有修改Beetl等模板内容也不用重新打包
@wendal 那请问我上面的pom配置文件是正确的吗
@wendal 而且我的配置文件是打在jar外面的,打开jar包看什么文件呢,不是很懂
@wendal 那我是得自己改下源码吗
@wendal 我在想可以在MainLauncher的main函数里改变ResourceLoader的搜索路径不
@wendal 好的,我先试试,谢谢!有问题再请教
@wendal 用setResourceLoader解决了模板问题,log4配置也生效了,现在就偏偏application貌似还是读取的jar包内的,请问有什么办法吗?
@wendal 大神,PropertiesConfigLoader的源码里找到如下代码
public void init() throws Exception {
// 首先, 确定一些从什么路径加载配置文件,默认值application.properties
String path = envHolder.get("nutz.boot.configure.properties_path", "application.properties");
// 另外,加载custom目录下的配置文件,与nutzcn一致
conf.setPaths("custom/");
// 加载application.properties
try (InputStream ins = resourceLoader.get(path)) {
if (ins != null) {
conf.load(Streams.utf8r(ins), false);
}
}
// 也许命令行里面指定了profile,需要提前load进来
PropertiesProxy tmp = new PropertiesProxy();
if (args != null) {
parseCommandLineArgs(tmp, args);
if (tmp.has("nutz.profiles.active")) {
conf.put("nutz.profiles.active", tmp.remove("nutz.profiles.active"));
}
}
if (allowCommandLineProperties) {
conf.putAll(System.getProperties());
}
// 加载指定profile,如果有的话
if (conf.has("nutz.profiles.active")) {
String profile = conf.get("nutz.profiles.active");
path = path.substring(0, path.lastIndexOf('.')) + "-" + profile + ".properties";
try (InputStream ins = resourceLoader.get(path)) {
if (ins != null) {
conf.load(Streams.utf8r(ins), false);
}
}
}
// 把命令行参数放进去
if (tmp.size() > 0) {
conf.putAll(tmp.toMap());
}
}
这里面的nutz.boot.configure.properties_path有没有可能是突破口
@wendal 不知道更改哪里的ResourceLoader,而且我看到上面源码里貌似可以用命令行传参告知程序读取其他配置文件,但不知道怎么用
我用
java -jar target/demo-2.0-SNAPSHOT.jar --profile=./target/application.properties
貌似不行
这个办法的变通倒是真可以了,但是application.properties里有8个以上的配置参数,如果都这样手动写参数传进去
第一,麻烦
第二,mysql redis等服务的密码全暴露在命令行了
还是得找一个能读取application.properties,或者在init里能否我自己写个方法读取,再把参数写入conf,关键现在不知道如何获取conf对象
PropertiesProxy propertiesProxy = nc.getIoc().get(PropertiesProxy.class, "conf");
propertiesProxy.put("jetty.port", "9999");
这样获取参数对象,并且写入进去,貌似并不行,感觉jetty的启动在Setup之前了
@wendal 提个建议吧,我觉得应该不止我一个人有把配置文件、静态文件放在jar包外面,方便有服务变动只需要修改配置文件的需求
所以我建议NutzBoot只需要约定application.properties放在jar包内,配置项进行约束
如:
jetty_config_path=@base/conf/jetty.properties
tomcat_config_path=@base/conf/tomcat.properties
mysql_config_path=@base/conf/app.properties
redis_config_path=@base/conf/redis.properties
template_path=@base/template
...
甚至可以简化为:
custom_config_dir=@base/conf/*
也可以做一个扩展,比如 :
new NbApp(MainLauncher.class).setConfigPath("").run();
那么直接在外部conf目录或任意目录放多少个properties都可以,灵活又方便
@wendal 我pull req后,是不是可以在NB官网的SNAPSHOT直接生成修改后的版本了
@wendal 看到你github上更新了一段检测当前目录下如果有application则读取进来,现在可以在NB上生成项目了吗?
如果你使用2.2-SNAPSHOT的话, 等 https://travis-ci.org/nutzam/nutzboot 成功后, mvn -U package 就可以了
@wendal 已经可以了,但是有个问题,java -jar必须在jar包目录下执行,否则还是读取不到application文件
建议使用绝对路径来读取,这样在服务器运维部署时,不用可以切到应用目录再启动应用
我的代码:
public static String getPath(String... name) {
String path = getBasePath();
for(int i=0; i< name.length; i++) {
path = path + File.separator + name[i];
}
return path;
}
public static String getBasePath() {
String basePath = MainLauncher.class.getProtectionDomain().getCodeSource().getLocation().getPath();
int lastIndex = basePath.lastIndexOf(File.separator);
basePath = basePath.substring(0, lastIndex);
try {
basePath = java.net.URLDecoder.decode(basePath, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return basePath;
}
调用
File tmp = new File(getPath(path));
嗯嗯, 顺便关注一下这个issue哦 https://github.com/nutzam/nutzboot/issues/94
@wendal 大神,我已经pull req了,你看看
1 新增支持读取jar包外部application.properties为绝对路径
2 新增支持application.properties配置configDir,可自动加载该目录下所有配置文件
不知是否可行
@wendal 大神,刚刚回来,更新发现你优化了读取配置文件的方法,但是配置信息读取不到