在IDEA中建立Spring-Boot多模块项目实战[JEES]版(二)

7 篇文章 0 订阅
7 篇文章 0 订阅

上一篇已经生成了Boot类型和Module类型2个模块,这里Boot模块尽量只用于管理其他模块所需要的公共配置内容,不需要在Boot中去写逻辑代码。

在Boot中,需要修改一下相关目录,根据上篇的Pom配置项<build>里的内容,修改Boot以及其他模块的基本目录结构为如下图:

删除2个模块中src目录下自动下生成子目录和文件,(这里可以根据喜好可以自行保留),并在对应的模块中建立resources目录,以及src.test目录。建立好之后,可以通过右键将这2个目录分别声明为资源目录和测试目录,操作见对目录右键后的Mark Directory as操作项。

接下来建立Startup类型模块,用于打包和发布应用的入口,步骤参考上篇Module类型模块的建立过程。

这里有个需要注意的地方,如果发现生成的目录或者结构存在问题,可以完全删除模块和对应目录中得文件重新生成,也可以手动调整Pom文件和工程配置文件(见Boot模块下的.idea目录)来进行修正。

新的Startup类型模块的Pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>jees.demo.mudule</artifactId>
        <groupId>jees.demo</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../boot/</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>jees.demo</groupId>
    <artifactId>jees.demo.startup</artifactId>

</project>

目前完整的目录结构如下:(图中资源目录名称写错了,请自行校正)

这里在来回顾一下3种类型的模块各自的作用,Boot用于管理整个工程设置,Module为独立的功能模块,Startup为应用的配置和程序入口。

接下来就可以模拟实际的项目开发了。

第一步,先准备SpringBoot的相关配置文件。

在Startup模块的resources目录中建立config目录,用于存放核心配置文件application-dev.yml和logback-dev.xml。这2个文件的名称是基于Boot模块中的profiles设置的dev和prod的2种运行环境中的一种。出处和相关用法,就不做更多说明了。

基础的application-dev.yml文件:

#日志配置
#指定日志配置文件
logging:
 config: classpath:config/logback-dev.xml

#SpringBoot配置
spring:
 application:
  name: JeesDemo
 profiles: dev
 config:
  location: config/

#jeesupport支持配置

完整的logback-dev.xml日志文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 转载:http://blog.csdn.net/appleyk/article/details/78717388 -->
<configuration>
	<property name="LOG_HOME" value="logs" />
	<property name="FILE_NAME" value="jees.demo.dev" />

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>[%p]%d{yyyy-MM-dd HH:mm:ss}[%C:%L] - %m%n</pattern>
			<!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
			<charset>UTF-8</charset>
		</encoder>
	</appender>

	<springProfile name="dev">
		<appender name="SYSLOG"
				  class="ch.qos.logback.core.rolling.RollingFileAppender">
			<File>${LOG_HOME}/${FILE_NAME}.log</File>
			<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
				<fileNamePattern>${LOG_HOME}/${FILE_NAME}.%d.%i.log</fileNamePattern>
				<maxHistory>30</maxHistory>
				<timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
					<maxFileSize>1MB</maxFileSize>
				</timeBasedFileNamingAndTriggeringPolicy>
			</rollingPolicy>
			<encoder>
				<pattern>
					[%p]%d{yyyy-MM-dd HH:mm:ss}[%C:%L] - %m%n
				</pattern>
				<!-- 记录日志的编码 -->
				<charset>UTF-8</charset> <!-- 此处设置字符集 -->
			</encoder>
			<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
				<level>DEBUG</level>
			</filter>
		</appender>
		<appender name="SYSERR"
				  class="ch.qos.logback.core.rolling.RollingFileAppender">
			<File>${LOG_HOME}/${FILE_NAME}.err</File>
			<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
				<fileNamePattern>${LOG_HOME}/${FILE_NAME}.%d.%i.err</fileNamePattern>
				<maxHistory>30</maxHistory>
				<timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
					<maxFileSize>1MB</maxFileSize>
				</timeBasedFileNamingAndTriggeringPolicy>
			</rollingPolicy>
			<encoder>
				<pattern>
					[%p]%d{yyyy-MM-dd HH:mm:ss }[%C:%L] - %m%n
				</pattern>
				<charset>UTF-8</charset> <!-- 此处设置字符集 -->
			</encoder>
			<filter class="ch.qos.logback.classic.filter.LevelFilter">
				<level>ERROR</level>
				<onMatch>ACCEPT</onMatch>
				<onMismatch>DENY</onMismatch>
			</filter>
		</appender>
	</springProfile>

	<!-- 控制台输出日志级别 -->
	<springProfile name="dev">
		<logger name="com.jees" level="INFO">
			<appender-ref ref="SYSLOG" />
		</logger>
		<root level="ERROR">
			<appender-ref ref="SYSERR" />
		</root>
	</springProfile>

	<root level="INFO">
		<appender-ref ref="STDOUT" />
	</root>
</configuration>

关于logback,这里使用了springProfile来控制对应的运行环境,并且将日志分为了.log文件和.err文件2种日志纪录方式,和STDOUT一种控制台输出方式。

第二步,新建程序的入口类com.jees.demo.Startup.java:

package com.jees.demo;

import lombok.extern.log4j.Log4j2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.DependsOn;

@Log4j2
@ComponentScan( "com.jees" )
@DependsOn({"commonContextHolder", "commonConfig" })
@SpringBootApplication( exclude = { DataSourceAutoConfiguration.class , HibernateJpaAutoConfiguration.class } )
public class Startup {
    public static void main( String[] _args ) {
        SpringApplication.run( Startup.class , _args );
    }
}

这里的几个注解都是有相关作用的,@ComponentSace和@DependsOn是JEES需要的部分,@SpringBootApplicationi中的exclude部分则是为了JDBS的使用屏蔽了SpringBoot中DataSource相关内容。

到此,整个项目的结构基本定稿了,应用的运行和打包都是基于Startup模块中的Pom文件来配置,下一篇将会介绍运行和打包。

最后一步,配置Startup的运行环境就可以了。如果不知道怎么配置Application的,可以先通过在Startup执行一次main方法,再在右上角修改运行配置进入下图,并进行相关设置:

请记住红圈中的2个部分,后面对于多应用在idea中的执行需要知道它们的作用。最后注意一下Working directory目录。

当前完整的项目结构如图:

请注意对比左侧的目录和文件结构,以及右侧Maven Profiles是否包含了dev和prod这2个部分,在切换多应用的执行程序时,需要用到它们。

最后我们看一下执行正确的运行日志:

个人觉得微服务的架构不仅仅是使用SpringBoot就叫微服务,而是在应用级别上的代码架构。这里整个应用的架构基于Module模块的内容可大可小,完全取决于对于功能模块的划分有多具体。希望各位在看过打包之后的结构,能够理解到这样的划分的意义在于它从代码的维护上以及应用的部署结构上提供了便利。

JEES的下载地址:https://github.com/aiyoyoyo/jeesupport

JEES的QQ群:8802330

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值