Maven проект здания, но не может найти классы во время выполнения - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть этот файл 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: compile (default-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] не может найти символ [ОШИБКА] символ: класс Gson [ОШИБКА] расположение: класс suman.App [ОШИБКА] / home / oleg / codes / oresoftware / oredoc / test / builds / java / gson / src / main / java / suman /App.java:[17,25] не может найти символ [ОШИБКА] символ: класс Gson [ОШИБКА] расположение: класс 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 в java.base / jdk.internal.loader.BuiltinClassLoader.loadClass (BuiltinClassLoader.java:583) в java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader.load.java: 190) в java.base / java.lang.ClassLoader.loadClass (ClassLoader.java:499) ... еще 1

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Хорошо, поэтому я строил свой проект с

$ 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, я думаю, что первое не то, что второе будет правильным.

0 голосов
/ 21 ноября 2018

Скорее всего, в вашем локальном репозитории 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.5directory.

Если нет файла jar, например gson-2.8.5.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

)

Если у вас определен этот репозиторий и вы находитесь за корпоративным прокси-сервером - проверьте настройки прокси-сервера для Maven в settings.xml

Кстати: во время выполнения у вас должны быть все необходимые файлы JAR в пути к классам, есливы создаете банку (не войну или ухо). В качестве альтернативы с Maven вы можете построить "толстую банку", и все классы из всех зависимостей будут там, но будьте готовы, это будет действительно большой толстый баночка.: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...