java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64: из библиотеки jar, импортированной с помощью Maven

#java #maven #apache-commons

#java #maven #apache-commons

Вопрос:

Я создал простую библиотеку jar, состоящую из этого единственного класса:

 import org.apache.commons.codec.binary.Base64;

public class NiceEncoder {
    public static String encode(String first, String second) {
        String encoded = new String(Base64.encodeBase64((first   ":"   second).getBytes()));
        return encoded;
    }
}
  

В нем есть это pom.xml :

 <?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>base64tester</groupId>
    <artifactId>base64tester</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

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

    <dependencies>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.6</version>
        </dependency>

    </dependencies>
</project>
  

Затем я упаковываю его в a jar и устанавливаю в локальный репозиторий maven:

 mvn install:install-file -Dfile=/home/base64tester-1.0-SNAPSHOT.jar         -DgroupId=base64tester -DartifactId=base64tester -Dversion=1.0-SNAPSHOT -Dpackaging=jar
  

Затем я импортирую его в другой проект, подобный этому:

 <dependencies>
        <dependency>
            <groupId>base64tester</groupId>
            <artifactId>base64tester</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
  

и попробуйте запустить этот код:

 public class TestNiceEncoder  {
   public static void main(String[] args) {
        String first = "some word";
        String second = "other word";
        System.out.println(NiceEncoder.encode(first, second));
    }
}
  

Я получаю сообщение об java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64 ошибке.

Почему? Как мне это исправить, кроме импорта commons-codec внутри проекта с TestNiceEncoder классом? Как мне сделать так, чтобы все, у кого есть base64tester.jar , могли запускать его без ошибок или дополнительных действий?

РЕДАКТИРОВАТЬ: то же самое и с другими зависимостями в base64tester проекте. Получил его для использования JSoup библиотеки, а затем, если метод, использующий его, вызывается из внешнего проекта, возникает исключение:

В проекте B:

 public class TestNiceEncoder  {
    public static void main(String[] args) {
     String first = "some word";
        String second = "other word";
       // System.out.println(NiceEncoder.encode(first, second));
        System.out.println(NiceEncoder.getRedditTitle()); //jsoup error here
    }
}
  

В проекте A (base64tester):

 public class NiceEncoder {
    public static String encode(String first, String second) {
        String encoded = new String(Base64.encodeBase64((first   ":"   second).getBytes()));
        return encoded;
    }

    public static String getRedditTitle()  {
        try {
            Document doc = Jsoup.connect("http://reddit.com/").get();
            String title = doc.title();
            System.out.println("title: "   title);
            return title;
        }
        catch (Exception e)  {
            System.out.println("Couldn't open URL");
            return "";
        }
    }
}
  
  <dependencies>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.13.1</version>
        </dependency>

    </dependencies>
  

ошибка в этом:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/jsoup/Jsoup
  

Комментарии:

1.Вы не используете командную строку? Нет командной строки — вам нужны эти сборки? Чувак заставляет меня делать это (Java) уже 5 лет… Я еще не использовал POM.xml (или mvn ). При компиляции с использованием javac вы просто добавляете их ( .jar файлы) в ПУТЬ к КЛАССУ Environment Variable — в UNIX или Windows

Ответ №1:

Этот шаг

Затем я упаковываю его в jar и устанавливаю в локальный репозиторий maven

требуется указать pom.xml файл, в противном случае создается один, но без информации о зависимостях

Что-то вроде (конечно, вам нужно настроить путь к pom.xml )

 mvn install:install-file -Dfile=/home/base64tester-1.0-SNAPSHOT.jar -DpomFile=/home/pom.xml
  

подробнее читайте в официальных документах.

В качестве альтернативы вы можете объявить явную зависимость от commons-codec в вашем нисходящем проекте (где вы используете свой jar)

Примечание, JDK8 уже включает поддержку кодека base64, смотрите Здесь — так что, возможно, вы можете использовать его напрямую, без каких-либо дополнительных jar в classpath

Комментарии:

1. Еще лучше, вообще не используйте install-file, просто запустите «mvn install» из корневого каталога вашего проекта, чтобы установить ваш jar и связанный с ним pom.

2. Спасибо, это сработало! Большое спасибо, правда. Потратил несколько часов, пытаясь найти решение.

Ответ №2:

Пакет зависимостей Base64Tester не включен в файл jar. Вы должны использовать установку mvn из проекта Base64Test