NutzCN Logo
分享 [文章分享]NutzBoot 如何打包发布
发布于 279天前 作者 文涛 276 次浏览 复制 上一个帖子 下一个帖子
标签:

前因

Nutz接触时间了,最近使用NutzBoot开发了个微服务,在准备部署的时候遇上一个问题,NutzBoot在发布时,会将配置文件、模板文件都打包进jar包,那么在后期做细微调整时将涉及到重新发包,本人强伯症,受不了这个,如果项目只是需要对配置做些修改,或者模板做些修改,完全没必要重新打包发布,故而发生了之后的事情 - 改造

过程

怎样把配置文件打包到jar包外面?

修改 pom.xml
<build>...</build>标签内加入配置,过滤resources目录

<resources>
	<resource>
		<directory>src/main/resources</directory>
		<excludes>
			<exclude>**/*</exclude>
		</excludes>
		<filtering>true</filtering>
	</resource>
</resources>

<build><plugins>...</plugins></build>标签内加入配置,将配置资源目录编译到jar包外

<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>

此时执行mvn clean;mvn compile;mvn package;已经可以将资源文件打包到jar包外部了。


那么问题来了,项目如何读取外部资源

首先我是想办法解决beetl模板文件的读取,因为NutzBoot项目没有考虑过外部读取的情况,所以必须经过改造,与@wendal进行讨论后,采取从Setup的init方法着手,手动指定模板读取路径,实现如下:

public class MainSetup implements Setup {
    @Override
    public void init(NutConfig nc) {
        for(ViewMaker maker: nc.getViewMakers()) {
            if(maker.getClass() == BeetlViewMakerStarter.class) {
                // 获取BeetlViewMaker对象
                BeetlViewMaker beetlViewMaker = (BeetlViewMaker)maker;
                // 生成FileResourceLoader 从文件系统取资源
                FileResourceLoader fileResourceLoader = new FileResourceLoader();
                fileResourceLoader.setCharset("UTF-8");
                // 设置jar包外部模板目录
                fileResourceLoader.setRoot(getBasePath() + File.separator + "template");
                // 配置beetlViewMaker使用外部目录读取模板
                beetlViewMaker.groupTemplate.setResourceLoader(fileResourceLoader);
            }
        }
    }

    @Override
    public void destroy(NutConfig nc) {

    }
    
    // 获取jar包当前目录
    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;
    }
}

外部模板读取问题解决,就剩下读取外部配置文件,于是跟@wendal 又进行各种沟通,最后决定修改源码让NutzBoot支持读取外部配置文件,顺便实现了指定配置文件目录自动扫描,详细步骤就不写了,如有兴趣可关注 论坛讨论贴 NutzBoot 如何打包发布

经过修改后,现在NutzBoot支持外部配置方式,比如将application.properties放在jar包同级目录。
另外application.properties新增支持配置读取其他配置文件,
如:

nutz.boot.configure.properties.dir=config
// 系统将自动扫描jar包同级config目录下所有properties文件进行参数读取

---

结束语

到此我外部读取参数和模板的需求算是圆满解决,也特别感谢@wendal给予的支持,特此记录

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