---
# System prepended metadata

title: JAVA Maven 錯誤處理
tags: [JAVA]

---

# JAVA Maven 錯誤處理

###### tags: `JAVA`

## 執行 `mvn package` 時報錯：[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

參考：[命令行mvn打包的时候报错：No compiler is provided in this environment. Perhaps you are running on a JRE](https://blog.csdn.net/hy_coming/article/details/101539121)

### 解決方式

先查看目前 mvn 的執行環境

![](https://i.imgur.com/76fcdjG.png)

可以看到這裡使用的JAVA_HOME是 JRE 所以要改成 JDK

#### 下載 JAVA JDK

到 Oracle 官網下載 [JAVA JDK](https://www.oracle.com/tw/java/technologies/javase-jdk15-downloads.html)，下載：jdk-15.0.1_windows-x64_bin.exe

![](https://i.imgur.com/XVZtv01.png)

建立目錄：C:\Java\jdk-15.0.1，並在安裝時指定安裝目錄為 C:\Java\jdk-15.0.1

![](https://i.imgur.com/kcyO6ku.png)

#### 重新設定 JAVA_HOME

重新設定 JAVA_HOME 為 C:\Java\jdk-15.0.1

![](https://i.imgur.com/1ZCKKT8.png)

可以看到 mvn 的 JAVA_HOME 變成了 C:\Java\jdk-15.0.1

![](https://i.imgur.com/DyEUwKK.png)

#### 重新執行打包 `mvn package`

![](https://i.imgur.com/HmzEYhk.png)

就可以看到打包成功了。

## Maven 編譯或測試時報錯，需要改 maven-compiler-plugin 配置

參考：[maven编译或测试时报错，需要改maven-compiler-plugin配置](https://www.cnblogs.com/yanweichen/p/9315239.html)

報錯訊息：

```
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project Test: Compilation failure: Compilation failure:
[ERROR] Source option 5 is no longer supported. Use 7 or later.
[ERROR] Target option 5 is no longer supported. Use 7 or later.
```

![](https://i.imgur.com/kl1zcw5.png)


在自己工程的 pom.xml 文件下添加如下配置信息：

```
  <build> 
    <plugins>   
      <plugin>    <!--plugins要写在build标签下，不然无法识别 -->
        <artifactId>maven-compiler-plugin</artifactId>   
        <version>3.1</version>    <!--maven-compiler-plugin版本写一个中央仓库有的版本，保存后它会自动下载 -->
        <configuration>   
          <source>10</source>    <!--我的jdk是10.0.1的，写成10.0.1不好用，所以就写成10了 -->
          <target>10</target>   
        </configuration>   
      </plugin> 
    </plugins> 
  </build>
```

### pom.xml 範例參考

```
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>idv.ete</groupId>
  <artifactId>Test</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Test</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build> 
    <plugins>   
      <plugin>    <!--plugins要写在build标签下，不然无法识别 -->
        <artifactId>maven-compiler-plugin</artifactId>   
        <version>3.1</version>    <!--maven-compiler-plugin版本写一个中央仓库有的版本，保存后它会自动下载 -->
        <configuration>   
          <source>10</source>    <!--我的jdk是10.0.1的，写成10.0.1不好用，所以就写成10了 -->
          <target>10</target>   
        </configuration>   
      </plugin> 
    </plugins> 
  </build>
</project>
```

### 重新執行測試或打包 `mvn test` or `mvn package`

![](https://i.imgur.com/HmzEYhk.png)

就可以看到測試或打包成功了。

## Maven 執行時報錯 java.lang.NoClassDefFoundError

參考：[NoClassDefFoundError on Maven dependency](https://stackoverflow.com/questions/10568275/noclassdeffounderror-on-maven-dependency)

報錯訊息：

```
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
        at idv.ete.App.<clinit>(App.java:9)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 1 more
```

![](https://i.imgur.com/SGMShNv.png)

發生原因：

默認情況下，Maven 不會把依賴項一起打包在生成的JAR文件中，並且在嘗試通過命令行執行JAR文件時，也不會在 classpath 中提供依賴項。這就是為什麼Java VM在嘗試執行代碼時找不到 library class files 文件的原因。

### 解決方式

在 pom.xml 中加入如下配置信息：

```
<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.4</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>
```

#### pom.xml 範例參考

```
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>idv.ete</groupId>
  <artifactId>log4jTest</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>log4jTest</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.25</version>
    </dependency>
  </dependencies>
  <build> 
    <plugins>   
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>3.2.4</version>
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>shade</goal>
              </goals>
            </execution>
          </executions>
      </plugin>
    </plugins> 
  </build>
</project>
```

### 重新執行打包 `mvn package`

![](https://i.imgur.com/HmzEYhk.png)

重新執行 `mvn package` 再執行 `java -cp target\log4jTest-1.0-SNAPSHOT.jar idv.ete.App`
![](https://i.imgur.com/bLh7k40.png)

就可以看到程式執行成功了。