kojow7
kojow7

Reputation: 11384

PDFBox with Maven - java.lang.NoClassDefFoundError

When installing PDFBox with Maven, it places the libraries in the ~/.m2/repository directory.

My program complies fine with mvn package.

When I try to run it with

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

then I get

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

Should I also be specifying the libraries in ~/.m2/repository as part of the classpath? This seems a bit too tedious to do it this way. What is the recommended way to specify the classpath of my PDFBox library while using the library location(s) of Maven?

Upvotes: 1

Views: 709

Answers (1)

kojow7
kojow7

Reputation: 11384

I wasn't able to find a nice solution with leaving the JAR files in ~/.m2, so the answer below is a workaround based on some other answers. I will be including more clarification though for those who are new to both PDFBox and maven as I am.

1) Add the following to your pom.xml file. If you already have a <build> and <plugins> section, just add the <plugin> section below to that. Otherwise you may need to add the whole code below within the <project> element:

  <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) Make sure that you replace the text in the <mainClass> element to match the situation. For example, if your main() method is located in an App class in App.js, and your package name is com.example.sub. Then the above element should read:

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

3) To compile your app, run mvn package

Note: I have seen some references online using mvn clean compile assembly:single instead of mvn package. I am not sure what the purpose of this is when mvn package seems to run just fine for me.

This will take your project and all of your dependencies and create a single JAR file in the target directory called something like this:

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

4) To run the project you can do this:

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

Make sure that you modify the above line to it your situation. In other words you may need to change both the name of the jar file and the name of the URI for your main class.

Upvotes: 1

Related Questions