【问题标题】:Maven project building but cannot find classes at runtimeMaven项目构建但在运行时找不到类
【发布时间】:2018-11-20 22:06:56
【问题描述】:

我有这个 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>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);            

    }
}

然后我安装:

$ mvn install -DskipTests

我得到这个编译错误

[ERROR] 未能执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.1:compile 项目suman上的(默认编译):编译失败:编译 失败:[错误] /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] 位置: 类苏曼.App

有人知道为什么找不到 gson 库吗?看起来很奇怪。

好的,如果我将其更改为:

import com.google.gson.*;

然后它会编译,但是如果我用java -jar 运行它,我会得到这个运行时错误

线程“主”java.lang.NoClassDefFoundError 中的异常: com/谷歌/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 更多

【问题讨论】:

  • 好的,所以如果我导入这个而不是这个com.google.gson.* 这个com.google.code.gson.* 它可以工作,但为什么会这样?
  • 尝试 maven clean build
  • @Deadpool 看到我在你上面的评论,你明白了吗?
  • 好吧,首先你为什么需要com.google.gson.* 只是尝试导入所需的导入语句
  • Java 程序有两个类路径——一个在编译时,另一个在运行时。您还需要在运行时在类路径中包含 gson 库。

标签: java maven gson


【解决方案1】:

很可能您的本地 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 代理设置

顺便说一句:在运行时,只要您构建 jar(不是 war 或 ear),您就必须在类路径中拥有所有需要的 jar 文件。作为 Maven 的替代方案,您可以构建“fat jar”,所有依赖项的所有类都将在那里,但准备好它将是一个非常大的 fat jar。 :-)

【讨论】:

    【解决方案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 文件,我认为前者不是后者是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2023-04-10
      • 2016-01-23
      • 2015-12-19
      • 1970-01-01
      相关资源
      最近更新 更多