ClassNotFound Исключение при использовании jenkins и maven - PullRequest
1 голос
/ 05 апреля 2020

Мне нужна твоя помощь. Я просто привыкаю к ​​Java и завершила свой первый этап в своем частном проекте. Теперь я хотел использовать этот этап как возможность разобраться с Дженкинсом и КИ.

Однако у меня возникли проблемы при запуске программы через Maven в Дженкинсе. Maven всегда выдает мне исключение ClassNotFound при обработке конвейера Jenkins. Но когда я запускаю программу локально в IntelliJ, она запускается без проблем.

Насколько я вижу, он не может найти POJO, который я использую для анализа XML с использованием JAXB.

Почему он не находит класс при сборке с использованием Jenkins, но находит все, когда я работаю локально, POM то же самое.

Это мой POM:

<groupId>groupId</groupId>
<artifactId>rss_backend</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.2.11</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.2.11</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.2.11</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>dev.morphia.morphia</groupId>
        <artifactId>core</artifactId>
        <version>1.5.8</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>projects.rss_backend.MainApp</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

, и это ошибка, которую я получаю при использовании jenkins / maven:

The following command runs and outputs the execution of your Java
application (which Jenkins built using Maven) to the Jenkins UI.
+ java -jar target/rss_backend-1.0-SNAPSHOT.jar
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
    at projects.rss_backend.MainApp.main(MainApp.java:20)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 1 more```

Понять, что я делаю не так или как я могу решить проблему?

Ответы [ 3 ]

1 голос
/ 05 апреля 2020

Обычные файлы jar не содержат зависимостей.

Вам необходимо создать исполняемый файл jar, как описано здесь: Как создать исполняемый файл JAR с зависимостями, используя Maven?

Вероятно, вы начали не банку с IntelliJ с java -jar, а с каким-то механизмом IntelliJ, который сделал магию c (то есть путь к классу) для вас.

0 голосов
/ 05 апреля 2020

Насколько я вижу, вы используете Java 11, что означает, что модули существуют.
Вы объявили свой собственный модуль (создайте информацию о модуле. java в вашей исходной папке)?
В большинстве случаев выше Java 8, где я видел ClassNotFoundException, отсутствовала зависимость от модуля. А это значит, что вы не можете взаимодействовать с тем, что пытаетесь сделать.

Я не знаком с Дженкинсом, однако я предполагаю, что либо
- ваш проект требует чего-то от Дженкинса
или
- Дженкинс пытается взаимодействовать с чем-то из вашего проекта через Reflection (например, создание объекта из базы данных).

В первом случае, в вашей информации о модуле. java, вы бы написали:
требует (транзитивно) jenkins-module-you-want-to- добавьте ;
во втором случае вы написали бы
открывает ваш-пакет данных в jenkins-module-that-needs-access ;

Это, по моему мнению, наиболее вероятный источник ClassNotFoundException, который вы получаете.
В любом случае, есть также вероятность того, что maven является источником вашей проблемы.

0 голосов
/ 05 апреля 2020

Я бы предложил обновить ваши jaxb deps: у меня в JDK11 + работает следующее:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.4.0-b180830.0438</version>
</dependency>

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.4.0-b180830.0359</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.4.0-b180830.0438</version>
</dependency>
...