PDFBox с Maven — java.lang.NoClassDefFoundError

При установке PDFBox с Maven библиотеки помещаются в каталог ~/.m2/repository.

Моя программа отлично соответствует mvn package.

Когда я пытаюсь запустить его с

java -cp target/java-project-1.0-SNAPSHOT.jar com.example.sub.App

тогда я получаю

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/pdfbox/pdmodel/PDDocument

Должен ли я также указывать библиотеки в ~/.m2/repository как часть пути к классам? Это кажется слишком утомительным, чтобы делать это таким образом. Каков рекомендуемый способ указать путь к классам моей библиотеки PDFBox при использовании местоположения библиотеки Maven?

Ваш путь к классам (-cp) имеет только ваш собственный проект, а не зависимости.

Mark Rotteveel 24.03.2019 09:41

Я просто добавляю их в подкаталог lib и добавляю его в путь к классам, но я не знаю, является ли это лучшей практикой.

Tilman Hausherr 24.03.2019 21:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
354
1

Ответы 1

Мне не удалось найти хорошее решение, оставив файлы JAR в ~/.m2, поэтому ответ ниже представляет собой обходной путь, основанный на некоторых других ответах. Я буду включать дополнительные пояснения для тех, кто плохо знаком с PDFBox и maven, как и я.

1) Добавьте следующее в файл pom.xml. Если у вас уже есть раздел <build> и <plugins>, просто добавьте к нему раздел <plugin> ниже. В противном случае вам может понадобиться добавить весь приведенный ниже код в элемент <project>:

  <build>
      <plugins>
          <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <configuration>
                  <archive>
                      <manifest>
                          <addClasspath>true</addClasspath>
                          <mainClass>**REPLACE THIS WITH THE FULL URI OF YOUR MAIN CLASS**</mainClass>
                      </manifest>
                  </archive>
                  <descriptorRefs>
                      <descriptorRef>jar-with-dependencies</descriptorRef>
                  </descriptorRefs>
              </configuration>
              <executions>
                  <execution>
                      <id>make-my-jar-with-dependencies</id>
                      <phase>package</phase>
                      <goals>
                          <goal>single</goal>
                      </goals>
                  </execution>
              </executions>
          </plugin>
      </plugins>
  </build>

2) Убедитесь, что вы заменили текст в элементе <mainClass> в соответствии с ситуацией. Например, если ваш метод main() находится в классе App в App.js, а имя вашего пакета — com.example.sub. Тогда вышеприведенный элемент должен выглядеть так:

<mainClass>com.example.sub.App</mainClass>

3) Чтобы скомпилировать приложение, запустите mvn package

Примечание. Я видел в Интернете некоторые ссылки с использованием mvn clean compile assembly:single вместо mvn package. Я не уверен, какова цель этого, когда mvn package, похоже, работает нормально для меня.

Это возьмет ваш проект и все ваши зависимости и создаст один файл JAR в целевом каталоге, который будет называться примерно так:

java-project-1.0-SNAPSHOT-jar-with-dependencies.jar

4) Чтобы запустить проект, вы можете сделать это:

java -cp target/java-project-1.0-SNAPSHOT-jar-with-dependencies.jar com.example.sub.App

Убедитесь, что вы изменили указанную выше строку в соответствии с вашей ситуацией. Другими словами, вам может потребоваться изменить как имя файла jar, так и имя URI для вашего основного класса.

Другие вопросы по теме