我有这个pom.xml文件:
C:\Program Files (x86)\Microsoft SDKs\Windows Kits
我有这个主文件:
<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>suman</groupId>
<artifactId>suman</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>suman</name>
<url>http://maven.apache.org</url>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
然后安装:
package suman;
import java.net.*;
import java.io.*;
import com.google.code.gson.*; // can't find this lib
public class App {
public static void main(String[] args) {
Gson gson = new Gson();
gson.toJson(1);
}
}
,我得到这个编译错误:
[错误]无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (默认编译)在项目苏南上:编译失败:编译 失败:[ERROR] /home/oleg/codes/oresoftware/oredoc/test/builds/java/gson/src/main/java/suman/App.java:[5,1] 包com.google.code.gson不存在[错误] /home/oleg/codes/oresoftware/oredoc/test/builds/java/gson/src/main/java/suman/App.java:[17,9] 找不到符号[ERROR]符号:类Gson [ERROR]位置: suman.App类[错误] /home/oleg/codes/oresoftware/oredoc/test/builds/java/gson/src/main/java/suman/App.java:[17,25] 找不到符号[ERROR]符号:类Gson [ERROR]位置: suman.App类
有人知道为什么找不到gson库吗?看起来真的很奇怪。
好吧,如果我将其更改为:
$ mvn install -DskipTests
然后将其编译,但是如果我使用import com.google.gson.*;
运行它,则会出现此运行时错误:
线程“主”中的异常java.lang.NoClassDefFoundError: com / google / gson / Gson 在suman.App.main(App.java:17)的原因:java.lang.ClassNotFoundException:com.google.gson.Gson 在java.base / jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) 在java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass(ClassLoaders.java:190) 在java.base / java.lang.ClassLoader.loadClass(ClassLoader.java:499) ...还有1个
答案 0 :(得分:2)
您的本地Maven存储库很可能没有用于以下目的的jar文件:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
尝试从〜/ .m2 / repository / com / google / code / gson / gson / 2.8.5目录中查找。
如果没有像gson-2.8.5.jar
这样的jar文件-简单的步骤就删除整个目录。
在下一个构建中,它将迫使Maven尝试从定义的远程存储库中下载该工件,然后您将看到它是如何传递的。
要么下载它,然后一切正常,要么就不会。
如果没有,请检查您的settings.xml(或pom文件)有关可从何处下载存储库(至少在Maven存储库列表(https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.5中),它是https://mvnrepository.com/artifact/com.google.code.gson/gson
如果已定义该存储库,并且位于公司代理之后,请在settings.xml中检查Maven的代理设置
BTW:在运行时,只要您构建jar(而不是war或ear),就必须在类路径中具有所有需要的jar文件。作为Maven的替代方案,您可以构建“胖罐”,所有依赖项中的所有类都将存在,但请准备好这将是一个非常大的胖罐。 :-)
答案 1 :(得分:2)
好,所以我正在与我建立项目
$ mvn install -DskipTests
然后运行:
$ java -cp target/suman-1.0-SNAPSHOT.jar suman.App
但是我应该使用mvn来运行它,就像这样:
$ mvn exec:java -Dexec.mainClass="suman.App"
现在它在类路径中具有正确的jar文件。使用普通的Java命令,它不知道在哪里找到com.google.code.gson
jar文件。
顺便说一句,我不知道为什么编译失败:
import com.google.code.gson.*;
但这成功了:
import com.google.gson.*;
根据pom.xml文件,我认为前者并不正确,而后者将是正确的。