При установке 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) имеет только ваш собственный проект, а не зависимости.
Я просто добавляю их в подкаталог lib и добавляю его в путь к классам, но я не знаю, является ли это лучшей практикой.




Мне не удалось найти хорошее решение, оставив файлы 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 для вашего основного класса.
Возможный дубликат Как я могу создать исполняемый файл JAR с зависимостями, используя Maven?