почему одна зависимость не включена в JAR в проекте Maven - PullRequest
0 голосов
/ 23 января 2020

РЕДАКТИРОВАТЬ: см. Редактирование ниже. Этот вопрос все еще требует внимания, потому что изменение pom, как было предложено, не изменило поведение даже после очистки.

У меня есть проект Java Maven с плагином для создания автономного JAR, который до сих пор работал отлично. В пом. xml,

        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>ptcs.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

Я недавно хотел использовать класс Fraction из org. apache .commons.math3, поэтому я сделал следующее. В моем коде

import org.apache.commons.math3.fraction.Fraction;

Добавление зависимости к pom. xml,

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-math3</artifactId>
        <version>3.6.1</version>
    </dependency>

EDIT: изначально тест был в pom, но я удалил его. Там не было никаких изменений в поведении. Я также убрал проект.

Я работаю в VS Code, который помещает небольшую кнопку «Выполнить» над public static void main. Эта кнопка запуска работает, но при попытке запустить отчеты JAR не существует определения класса для Fraction. Также запуск mvn java:exec ... сообщает об этой же проблеме.

Что я делаю не так и почему он работал до добавления этой зависимости?

Ошибка, которую я получаю при запуске JAR, составляет

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache 
/commons/math3/fraction/Fraction
    at ptcs.App.main(App.java:39)
Caused by: java.lang.ClassNotFoundException:        
org.apache.commons.math3.fraction.Fraction
    at

java .base / jdk.internal.loader.BuiltinClassLoader.loadClass (BuiltinClassLoader. java: 583) в java .base / jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass ( ClassLo

aders.java:178)

    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)

    ... 1 more

Ответы [ 2 ]

3 голосов
/ 23 января 2020

Это потому, что зависимость помечена только для области действия test, и это означает, что зависимость требуется только на этапе тестирования.

Процесс сборки, чтобы заставить файл jar исключить эти файлы из упакованного файла jar а также исключить этот файл при запуске приложения с mvn java:exec ....

Чтобы исправить это просто удалите <scope>test</scope>

0 голосов
/ 23 января 2020

Содержится ли упаковка в банке? Кроме того, вы использовали плагин maven-dependency-plugin?

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.10</version>
            </plugin>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...