IDEA社区版(IDEA Community Edition)创建Springboot父子项目
1. 因为社区版不支持使用spring Spring Initializr 的方式创建项目, 但是我们可以考虑使用别的方式达到效果:
创建方式有3种:
第一种:使用https://start.spring.io/ 官方URL创建项目,再导入到 IDEA Community Edition(后面简称:ideaC)。具体使用自行百度。缺点:没办法自定义springboot的版本。
第二种:下载插件:Spring boot Assistant, 然后就可以按照商业版的方式创建。
第三种:也是我今天推荐使用的方式。用ideaC的方式来创建:
注释:有兴趣用老的破解版idea创建父子项目的可以参考: https://www.cnblogs.com/lgg20/p/17730376.html
1. 创建父工程:
2. 右键父项目,新建moudle第一个子模块idea-service,需要自己填写对应的groupId 和Artifactld:
3. 同样的方式再创建一个子项目idea-stub:
4. 修改父工程的pom文件,添加springboot-parent 依赖 及其你想添加的依赖:
<?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">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>idea-service</module>
<module>idea-stub</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.2</version>
<relativePath/>
</parent>
<groupId>org.example</groupId>
<artifactId>demo-IdeaC</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
5. 查看idea-stub的依赖有没问题,因为我设计stub项目是为了暴露服务的,暂时不需要添加其他jar包:
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.example</groupId>
<artifactId>demo-IdeaC</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>idea-stub</artifactId>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
6. 查看idea-service的依赖,主要是spring-web的jar包,这是主服务端,需要负责项目启动,还要添加IdeaDemoApplication 启动类:
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.example</groupId>
<artifactId>demo-IdeaC</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>idea-service</artifactId>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- spring-boot启动相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.2</version>
</dependency>
</dependencies>
</project>
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@Configuration
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@ComponentScan({"org.example.*"})
public class IdeaDemoApplication {
public static void main(String[] args) {
SpringApplication.run(IdeaDemoApplication.class, args);
}
}
7. 如果不需要加载数据源的话,配置启动应用程序:
8. 结果:
9. 如果需要配置数据源的再启动的话,需要添加yml文件,@SpringBootApplication(exclude =)要取消排除数据源:
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@Configuration
@SpringBootApplication()
@ComponentScan({"org.example.*"})
public class IdeaDemoApplication {
public static void main(String[] args) {
SpringApplication.run(IdeaDemoApplication.class, args);
}
}
10. 因为需要测试连接数据库,所以我简单写了一个查询的controller去查询dataBase,涉及用到mybatisPlus,所以还需要修改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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.example</groupId>
<artifactId>demo-IdeaC</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>idea-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- spring-boot启动相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.2</version>
</dependency>
<!-- 依赖子模块 -->
<dependency>
<artifactId>idea-stub</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<!-- mybatis-plus 相关依赖-->
<!-- 原来mybatis plus的包都删除,替换成以下两个 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.5.5</version>
</dependency>
<!-- mysql连接 相关依赖-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>
</dependencies>
</project>
12. 启动之后看日志:
13. 再调用接口测试是否有数据:
14. 日志成功打印,完成简单的用ideaC创建项目工程。:
15. 如果你想加载 skywalking + logBack 作为日志收集器,那么logback-spring.xml 可以参考一下配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--region 变量定义-->
<!-- 定义日志文件的存储地址 -->
<!--使用springProperty从yml文件中读取配置信息-->
<springProperty scope="context" name="SAVE_PATH" source="logging.path" defaultValue="/data/logs/mc"/>
<springProperty scope="context" name="LOG_LEVEL" source="logging.level" defaultValue="info"/>
<springProperty scope="context" name="SERVER_NAME" source="spring.application.name"/>
<!-- 包含TraceId日志格式 -->
<!-- ${CONSOLE_LOG_PATTERN} 是一个占位符,下面配置的,它引用了一个名为 CONSOLE_LOG_PATTERN 的属性。该属性的值用作日志输出的格式模式 -->
<!-- source表示要从名为logging.console.pattern的属性中获取属性值。如果没有则取默认值defaultValue -->
<springProperty scope="context" name="CONSOLE_LOG_PATTERN" source="logging.console.pattern"
defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36}[%F:%L] -%msg%n"/>
<!-- FILE_LOG_PATTERN 文件格式日志,CONSOLE_LOG_PATTERN 控制台格式日志 -->
<springProperty scope="context" name="FILE_LOG_PATTERN" source="logging.file.pattern"
defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{50}[%F:%L] -%msg%n"/>
<!-- 文件切割大小 -->
<property name="maxFileSize" value="500MB"/>
<!-- 文档保留天数 -->
<property name="maxHistory" value="20"/>
<!-- 文档保留总大小 -->
<property name="totalSizeCap" value="50GB"/>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<!--endregion 变量定义结束-->
<!--region 配置日志过滤匹配规则,无先后顺序,由filter决定是否匹配-->
<!--appender: <appender=输出目标>。 设置日志信息的去向,常用的有以下几个
ch.qos.logback.core.ConsoleAppender (控制台)
ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新文件)
ch.qos.logback.core.FileAppender (文件)-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 字符串System.out(默认)或者System.err -->
<target>System.out</target>
<!-- 使用了 LayoutWrappingEncoder 类作为日志编码器的实现,并使用了 TraceIdPatternLogbackLayout 类作为日志布局的实现。
这种配置可能是为了支持特定的需求或应用程序框架,例如Apache SkyWalking APM。可能提供了特定的功能,如在日志中包含追踪 ID(Trace ID)等 -->
<!-- 这定义了日志编码器,用于将日志事件格式化为字符串。并指定了其类为LayoutWrappingEncoder-->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
</layout>
</encoder>
</appender>
<!-- 如果没有指定具体的编码器类,而是直接使用 <encoder> 标签,它会根据 Logback 默认的编码器进行处理。
Logback默认的编码器是 ch.qos.logback.classic.encoder.PatternLayoutEncoder。-->
<!-- <property name="pattern" value="%d{yyyyMMdd:HH:mm:ss} [%thread] %-5level %C %L%n %msg%n%n"/>-->
<!-- <encoder>-->
<!-- <Pattern>${pattern}</Pattern>-->
<!-- </encoder> -->
<!--endregion 配置日志过滤匹配规则,无先后顺序,由filter判断是否匹配-->
<!-- 这定义了一个名为 "APP_ERROR" 的日志附加器,表示这个附加器用于将日志消息写入文件,并支持日志文件的滚动(rolling)。) -->
<appender name="APP_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${SAVE_PATH}/${SERVER_NAME}/${SERVER_NAME}-error.log</file> <!--这指定了日志文件的路径和文件名-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--这定义了日志文件的滚动策略-->
<FileNamePattern>${SAVE_PATH}/${SERVER_NAME}/${yyyy-MM}/${SERVER_NAME}-error-%d{yyyy-MM-dd}-%i.log</FileNamePattern> <!--这定义了滚动生成的日志文件的命名模式。-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize> <!-- 文件切割大小 -->
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${maxHistory}</maxHistory> <!-- 文档保留天数 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap> <!-- 文档保留总大小 -->
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <!-- 这定义了日志编码器,用于将日志事件格式化为字符串。-->
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${FILE_LOG_PATTERN}</Pattern>
</layout>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--这定义了日志过滤器,用于过滤日志事件。在这里,只接受错误级别(ERROR)的日志消息,并拒绝其他级别的消息。-->
<level>ERROR</level> <!-- LevelFilter: 级别过滤器,根据日志级别进行过滤 -->
<onMatch>ACCEPT</onMatch> <!-- 用于配置符合过滤条件的操作 ACCEPT:日志会被立即处理,不再经过剩余过滤器 -->
<onMismatch>DENY</onMismatch> <!-- 用于配置不符合过滤条件的操作 DENY:日志将立即被抛弃不再经过其他过滤器 -->
</filter>
</appender>
<!-- 这定义了一个名为 "APP_INFO" 的日志附加器,表示这个附加器用于将日志消息写入文件,并支持日志文件的滚动(rolling)。) -->
<appender name="APP_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${SAVE_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${SAVE_PATH}/${SERVER_NAME}/%d{yyyy-MM}/${SERVER_NAME}-info-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${maxHistory}</maxHistory>
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${FILE_LOG_PATTERN}</Pattern>
</layout>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--除了SQL_INFO命名不一样,其他和上面一样,可不要配置,除非是为了多记不同类型的日志-->
<appender name="SQL_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${SAVE_PATH}/${SERVER_NAME}/${SERVER_NAME}-sql-info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${SAVE_PATH}/${SERVER_NAME}/${date:yyyy-MM}/${SERVER_NAME}-sql-info-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${maxHistory}</maxHistory>
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${FILE_LOG_PATTERN}</Pattern>
</layout>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--除了SQL_ERROR命名不一样,其他和上面一样,可不要配置,除非是为了多记不同类型的日志-->
<appender name="SQL_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${SAVE_PATH}/${SERVER_NAME}/${SERVER_NAME}-sql-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${SAVE_PATH}/${SERVER_NAME}/${date:yyyy-MM}/${SERVER_NAME}-sql-error-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${maxHistory}</maxHistory>
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${FILE_LOG_PATTERN}</Pattern>
</layout>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
<loger> 仅有一个name属性,一个可选的level和一个可选的addtivity属性
name: 用来指定受此logger约束的某一个包或者具体的某一个类。
level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,如果未设置此属性,那么当前logger将会继承上级的级别。
additivity: 是否向上级loger传递打印信息。默认是true。
<logger> 可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger
<appender-ref ref="STDOUT">: 这是将一个输出目标(appender)与该日志记录器关联的元素。ref属性设置为"STDOUT",表示该日志记录器的日志消息将被输出到标准输出(通常是控制台)
-->
<!--这是定义一个日志记录器的开始标签。在日志记录系统的配置文件中用于定义不同的日志记录器的日志级别和输出目标(appender)-->
<logger name="java.sql" level="info" additivity="false">
<level value="info"/>
<appender-ref ref="STDOUT"></appender-ref>
<!--<appender-ref ref="SQL_INFO"></appender-ref>-->
</logger>
<logger name="java.sql" level="error" additivity="false">
<level value="error"/>
<appender-ref ref="STDOUT"></appender-ref>
<!-- <appender-ref ref="SQL_INFO"></appender-ref>-->
<!-- <appender-ref ref="SQL_ERROR"></appender-ref>-->
</logger>
<!-- <root>元素定义了根日志记录器(root logger),它是整个日志体系中的最高级别的日志记录器。所有没有明确指定日志记录器的日志消息都会经过根日志记录器处理。
${LOG_LEVEL}是一个在运行时动态设置的属性,它会根据应用程序的配置来确定根日志记录器的日志级别
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
<root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。
-->
<root level="${LOG_LEVEL}">
<appender-ref ref="STDOUT"/>
<!-- <appender-ref ref="APP_ERROR"/>-->
<!-- <appender-ref ref="APP_INFO"/>-->
</root>
</configuration>