首页 文章

Maven项目构建但在运行时无法找到类

提问于
浏览
2

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

我得到这个编译错误:

[错误]无法执行目标org.apache.maven.plugins:maven-compiler-plugin:3.1:在项目suman上编译(default-compile):编译失败:编译失败:[ERROR] / home / oleg / codes / oresoftware / oredoc / test / builds / java / gson / src / main / java / suman / App.java:[5,1]包com.google.code.gson不存在[ERROR] / home / oleg / codes / oresoftware / oredoc / test / builds / java / gson / src / main / java / suman / App.java:[17,9]找不到符号[ERROR]符号:class Gson [ERROR] location:class suman.App [ERROR ] /home/oleg/codes/oresoftware/oredoc/test/builds/java/gson/src/main/java/suman/App.java:[17,25]找不到符号[ERROR]符号:class Gson [ERROR]位置:类suman.App

有谁知道为什么它找不到gson库?看起来很奇怪 .

好的,如果我把它改成:

import com.google.gson.*;

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

线程“main”中的异常java.lang.NoClassDefFoundError:com / google / gson / Gson at suman.App.main(App.java:17)引起:java.lang.ClassNotFoundException:com.google.gson.Gson at java.base / jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)位于java.base / java的java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass(ClassLoaders.java:190) . lang.ClassLoader.loadClass(ClassLoader.java:499)......还有1个

2 回答

  • 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的替代方案,您可以构建“胖 jar ”,并且所有依赖项中的所有类都将存在,但是准备好它将是一个非常大的胖 jar . :-)

  • 2

    好的,所以我正在构建我的项目

    $ mvn install -DskipTests
    

    然后运行它:

    $ java -cp target/suman-1.0-SNAPSHOT.jar suman.App
    

    但我应该使用mvn来运行它,就像这样:

    $ mvn exec:java -Dexec.mainClass="suman.App"
    

    现在它在类路径中有正确的jar文件 . 使用plain java命令,它不知道在哪里可以找到 com.google.code.gson jar文件 .

    顺便说一句,我不知道为什么这不能编译:

    import com.google.code.gson.*;
    

    但这成功了:

    import com.google.gson.*;
    

    根据pom.xml文件,我认为前者不是后者是正确的 .

相关问题