IDEA社群版(IDEA Community Edition)建立Springboot父子專案

威兰达發表於2024-05-14

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. 建立父工程:

IDEA社群版(IDEA Community Edition)建立Springboot父子專案

2. 右鍵父專案,新建moudle第一個子模組idea-service,需要自己填寫對應的groupId 和Artifactld:

IDEA社群版(IDEA Community Edition)建立Springboot父子專案

3. 同樣的方式再建立一個子專案idea-stub:

IDEA社群版(IDEA Community Edition)建立Springboot父子專案

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>
6.1 還需要修改2個子專案的打包方式為jar,父工程確認為pom:
IDEA社群版(IDEA Community Edition)建立Springboot父子專案
6.2: 新增IdeaDemoApplication 啟動類,要修改ComponentScan()掃描的地方:
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. 如果不需要載入資料來源的話,配置啟動應用程式:
IDEA社群版(IDEA Community Edition)建立Springboot父子專案

8. 結果:
IDEA社群版(IDEA Community Edition)建立Springboot父子專案

9. 如果需要配置資料來源的再啟動的話,需要新增yml檔案,@SpringBootApplication(exclude =)要取消排除資料來源:

IDEA社群版(IDEA Community Edition)建立Springboot父子專案

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. 啟動之後看日誌:

IDEA社群版(IDEA Community Edition)建立Springboot父子專案

13. 再呼叫介面測試是否有資料:

IDEA社群版(IDEA Community Edition)建立Springboot父子專案

14. 日誌成功列印,完成簡單的用ideaC建立專案工程。:

IDEA社群版(IDEA Community Edition)建立Springboot父子專案

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>

相關文章