# 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 的執行環境  可以看到這裡使用的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  建立目錄:C:\Java\jdk-15.0.1,並在安裝時指定安裝目錄為 C:\Java\jdk-15.0.1  #### 重新設定 JAVA_HOME 重新設定 JAVA_HOME 為 C:\Java\jdk-15.0.1  可以看到 mvn 的 JAVA_HOME 變成了 C:\Java\jdk-15.0.1  #### 重新執行打包 `mvn package`  就可以看到打包成功了。 ## 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. ```  在自己工程的 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`  就可以看到測試或打包成功了。 ## 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 ```  發生原因: 默認情況下,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`  重新執行 `mvn package` 再執行 `java -cp target\log4jTest-1.0-SNAPSHOT.jar idv.ete.App`  就可以看到程式執行成功了。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up