簡體   English   中英

運行 spring-boot-maven-plugin 配置的胖 JAR 時出現 ClassNotFoundException

[英]ClassNotFoundException when running fat JAR configured by spring-boot-maven-plugin

我正在嘗試為我的 spring 啟動應用程序創建可執行的 JAR 文件。 為實現此 spring-boot-maven-plugin 已與指定的主要 class 一起使用,並包裝為 jar。 不幸的是,在運行 output JAR 文件后,我收到 java.lang.ClassNotFoundException 指向我的主要 java.lang.ClassNotFoundException

下面是我的 pom.xml 和主要的 class。 提前感謝您的幫助。

pom.xml:

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

    <groupId>com.test</groupId>
    <artifactId>interflight</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>interflight</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <feign-gson.version>7.2.1</feign-gson.version>
        <spring-cloud.version>Edgware.SR1</spring-cloud.version>
        <gson.version>2.8.0</gson.version>
        <assertj-core.version>3.8.0</assertj-core.version>
   <startClass>com.test.interflight.configuration.InterflightApplication</startClass>
  </properties>

    <dependencies>
    <!--External dependencies-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-gson</artifactId>
            <version>${feign-gson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>${gson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    <!--Test dependencies-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    <dependency>
      <groupId>org.assertj</groupId>
      <artifactId>assertj-core</artifactId>
      <version>${assertj-core.version}</version>
      <scope>test</scope>
    </dependency>
    </dependencies>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <finalName>${project.artifactId}</finalName>
          <layout>ZIP</layout>
          <mainClass>com.test.interflight.configuration.InterflightApplication</mainClass>
        </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Output 錯誤:

    $ java -jar interflight.jar
Exception in thread "main" java.lang.ClassNotFoundException: com.test.interfl
ight.configuration.InterflightApplication
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(Laun
chedURLClassLoader.java:94)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner
.java:46)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLau
ncher.java:587)

主class:

@SpringBootApplication
@ComponentScan(basePackages = {"com.test.interflight.controller", "com.test.interflight.implementation.*"})
@EnableFeignClients(basePackages = {"com.test.interflight.api.restclient"},
                    defaultConfiguration = FeignConfiguration.class)
public class InterflightApplication {

    public static void main(String[] args) {
        SpringApplication.run(InterflightApplication.class, args);
    }
}

簡短答案:

看起來當您應該使用JAR布局時,您正在使用ZIP布局。 在Spring Boot maven插件聲明中將<layout>ZIP</layout>更改為<layout>JAR</layout>

更長的答案:

看一下將ZIP布局描述為的文檔

  • ZIP (別名為DIR ):與使用PropertiesLauncherJAR布局相似。

其中, PropertiesLauncher 在文檔中描述為:

  • 用於通過屬性文件通過用戶配置的類路徑和主類進行歸檔的啟動器...
  • 在不同位置查找屬性文件以提取加載程序設置,默認為application.properties ...無默認設置,但會回退以在MANIFEST.MF中尋找Start-Class

如果希望用戶在Jar文件中指定它,請在Jar的meta-inf文件夾中指定(或檢查並查看是否已經有一個),或自行指定屬性。

經過幾天處理各種插件后,我終於可以制作一個胖 jar (spring boot) 並在我想要的任何地方外部化配置文件。 您可以使用以下插件:“config”是 jar 文件旁邊的配置文件的路徑。

<plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <finalName>jarfilename</finalName>
                    <mainClass>com.start.YourStarter</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <phase>install</phase>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>**/log4j.xml</exclude>
                        <exclude>deploy/**</exclude>
                        <exclude>**/*.properties</exclude>
                        <exclude>**/*.txt</exclude>
                    </excludes>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.start.YourStarter</mainClass>
                            <useUniqueVersions>false</useUniqueVersions>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>config/</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
   </plugin>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM