spring boot項目沒有mainClass如何實現打包運行

springboot項目沒有mainClass實現打包運行

項目分為兩個部分,一個是業務代碼模塊,一個是框架模塊,運行class放在框架部分,那業務代碼如何配置才能正常運行?

框架starter運行類如下

@SpringBootApplication(
    scanBasePackages = {"com"}
)
public class Starter {

@SpringBootApplication隻會掃描@SpringBootApplication註解標記類包下及其子包的類(特定註解標記,比如說@Controller,@Service,@Component,@Configuration和@Bean註解等等)納入到spring容器,如果不在@SpringBootApplication註解標記類相同包下及其子包的類,需要我們去配置一下掃包路徑,即scanBasePackages 。

業務代碼模塊如何配置?

借助spring-boot-maven-plugin配置如下

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.core.Starter</mainClass>
                    <layout>ZIP</layout>
                    <classifier>exec</classifier>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

mainClass最終會在jar包裡的MANIFEST.MF文件中指定

Start-Class: com.core.Starter

Spring Boot Maven plugin的5個Goals

  • spring-boot:repackage,默認goal。在mvn package之後,再次打包可執行的jar/war,同時保留mvn package生成的jar/war為.origin
  • spring-boot:run,運行Spring Boot應用
  • spring-boot:start,在mvn integration-test階段,進行Spring Boot應用生命周期的管理
  • spring-boot:stop,在mvn integration-test階段,進行Spring Boot應用生命周期的管理
  • spring-boot:build-info,生成Actuator使用的構建信息文件build-info.properties

layout屬性的值可以如下:

  • JAR,即通常的可執行jar
  • Main-Class: org.springframework.boot.loader.JarLauncher
  • WAR,即通常的可執行war,需要的servlet容器依賴位於WEB-INF/lib-provided
  • Main-Class: org.springframework.boot.loader.warLauncher
  • ZIP,即DIR,類似於JAR
  • Main-Class: org.springframework.boot.loader.PropertiesLauncher
  • MODULE,將所有的依賴庫打包(scope為provided的除外),但是不打包Spring Boot的任何Launcher
  • NONE,將所有的依賴庫打包,但是不打包Spring Boot的任何Launcher

classifier

生成可執行jar包的後綴名

includeSystemScope

將system范圍依賴包也打進來,如

<dependency>
            <groupId>com.alipay</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>1.1</version>
            <scope>system</scope>
            <systemPath>
                ${project.basedir}/local_repo/com/alipay/alipay-sdk-java/1.1/alipay-sdk-java-1.1.jar
            </systemPath>
        </dependency>

使用maven打包指定mainClass

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.xxx.XxxApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: