NutzCN Logo
问答 NutzBoot 如何打包发布
发布于 2267天前 作者 文涛(wentao) 4037 次浏览 复制 上一个帖子 下一个帖子
标签:

NutzBoot官方生成的依赖jetty启动,调试运行没有问题,但不知道如何打包发布,很头疼,请问有没有相关文档,MAC系统,貌似没有安装maven之类的工具

52 回复

安装maven最新版,然后在项目根目录执行 mvn package 即可

谢谢,编译通过,可以正常使用!
但是遇到一个新问题,我将配置文件打包到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等模板内容也不用重新打包

其实你需要的是 配置中心

至于什么配置没生效,打开jar包看文件最明显

@wendal 那请问我上面的pom配置文件是正确的吗

@wendal 而且我的配置文件是打在jar外面的,打开jar包看什么文件呢,不是很懂

如果修改log4j.properties没生效,那就是肯定存在另外一个log4j.properties文件,应该就在jar包内

额。。刚刚重新编译,log4可以了,application又没用了,而且还提示beetl的模板文件找不到,但是模板文件已经在jar包外面了,看来还需要不断折腾

好像没考虑到beetl的模板放在外面的情况 org.nutz.boot.starter.beetl.BeetlViewMakerStarter

@wendal 那我是得自己改下源码吗

你先看看源码吧,可以自定义ResourceLoader

@wendal 我在想可以在MainLauncher的main函数里改变ResourceLoader的搜索路径不

main方法不行,但init可以,你可以拿到ioc容器,然后拿到BeetlViewMaker它有个groupTemplate属性,可以setResourceLoader

大概是这样

@wendal 好的,我先试试,谢谢!有问题再请教

@wendal 用setResourceLoader解决了模板问题,log4配置也生效了,现在就偏偏application貌似还是读取的jar包内的,请问有什么办法吗?

而且我发现jar包内也没有读取,所以默认使用8080端口启动的jetty

application.properties吗? 有可能,先报个issue吧,我看看怎么搞一下

发现可以重写下AppContext,我先试试

@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有没有可能是突破口

resourceLoader 改一下 优先从本地目录查找,也许更好一些

@wendal 不知道更改哪里的ResourceLoader,而且我看到上面源码里貌似可以用命令行传参告知程序读取其他配置文件,但不知道怎么用
我用

java -jar target/demo-2.0-SNAPSHOT.jar --profile=./target/application.properties

貌似不行

使用 --nutz.profiles.active=./target/application.properties 也不行

这一行,需要改一下get方法的逻辑

resourceLoader.get(path)

啊,那不是要改NutzBoot的源代码?

我尝试了好几次貌似NutzBoot的参数加载并没有接收命令行传参 比如: java -jar demo.jar --jetty.port=9090

java -Djetty.port=9090 -jar demo.jar

这个办法的变通倒是真可以了,但是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之前了

@qq_b1ca03f7 等我晚上改一下吧,或者你发个pull。req也行,报issue也可以

@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直接生成修改后的版本了

说起来,conf目录的想法还真的行,跟jar同一目录下的custom目录就是,叫custom不叫conf

        // 另外,加载custom目录下的配置文件,与nutzcn一致
        conf.setPaths("custom/");

但是对于NutzBoot先买个,这个还是扫描的jar包内的custom目录吧

嗯, 优先级比application.properties要低,所以还是不行,待我改改吧

@wendal 看到你github上更新了一段检测当前目录下如果有application则读取进来,现在可以在NB上生成项目了吗?

如果你使用2.2-SNAPSHOT的话, 等 https://travis-ci.org/nutzam/nutzboot 成功后, mvn -U package 就可以了

改一下版本号吧, 兼容的

唯一区别就是需要把 nutzboot-starter 这个依赖去掉

@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));

我先改一下pull req你看看行不行

@wendal 大神,我已经pull req了,你看看
1 新增支持读取jar包外部application.properties为绝对路径
2 新增支持application.properties配置configDir,可自动加载该目录下所有配置文件
不知是否可行

嗯嗯,我先看看哦

@wendal 大神,刚刚回来,更新发现你优化了读取配置文件的方法,但是配置信息读取不到

额, debug一下看看我哪里改错了?

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