Class NotFoundException in a Maven Project

There is a maven-based project that can be created maven install, but throwing an exception when starting jar:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/CommandLineParser
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.CommandLineParser
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

I want to know why Java cannot find the maven dependency library?

<?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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.artofsolving.jodconverter</groupId>
  <artifactId>jodconverter-core</artifactId>
  <version>3.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>JODConverter - Core Library</name>
  <description>
    JODConverter converts office documents using OpenOffice.org
  </description>
  <url>http://jodconverter.googlecode.com</url>
  <licenses>
    <license>
      <name>GNU Lesser General Public License, Version 3 or later</name>
      <url>http://www.gnu.org/licenses/lgpl.html</url>
    </license>
  </licenses>
  <scm>
    <url>http://jodconverter.googlecode.com/svn/trunk/jodconverter-core</url>
    <connection>scm:svn:https://jodconverter.googlecode.com/svn/trunk/jodconverter-core/</connection>
  </scm>
  <inceptionYear>2003</inceptionYear>
  <developers>
    <developer>
      <id>mirko.nasato</id>
      <name>Mirko Nasato</name>
      <email>mirko@artofsolving.com</email>
    </developer>
  </developers>
  <contributors>
    <contributor>
      <name>Shervin Asgari</name>
      <email>shervin@asgari.no</email>
    </contributor>
  </contributors>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <repositories>
    <repository>
      <!-- required for org.hyperic:sigar -->
      <id>jboss-public-repository-group</id>
      <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
    </repository>
  </repositories>

  <dependencies>

    <!-- Required dependencies -->

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>org.openoffice</groupId>
      <artifactId>juh</artifactId>
      <version>3.2.1</version>
    </dependency>
    <dependency>
      <groupId>org.openoffice</groupId>
      <artifactId>ridl</artifactId>
      <version>3.2.1</version>
    </dependency>
    <dependency>
      <groupId>org.openoffice</groupId>
      <artifactId>unoil</artifactId>
      <version>3.2.1</version>
    </dependency>

    <dependency>
      <!-- for the command line tool -->
      <groupId>commons-cli</groupId>
      <artifactId>commons-cli</artifactId>
      <version>1.2</version>
    </dependency>

    <!-- Optional dependencies -->


    <dependency>
      <!-- for more robust process management -->
      <groupId>org.hyperic</groupId>
      <artifactId>sigar</artifactId>
      <version>1.6.5.132</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <!-- for JSON configuration -->
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20090211</version>
      <optional>true</optional>
    </dependency>

    <!--  Test dependencies -->

    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.0.1</version>
      <scope>test</scope>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.7.2</version>
        <configuration>
          <!-- don't run tests in parallel -->
          <perCoreThreadCount>false</perCoreThreadCount>
          <threadCount>1</threadCount>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.1</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>org.artofsolving.jodconverter.cli.Convert</mainClass>
              <addClasspath>true</addClasspath>
            </manifest>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2-beta-5</version>
        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/dist.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.7</version>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <version>2.4</version>
      </plugin>
    </plugins>
  </reporting>

</project>
+5
source share
3 answers

When you run the Jar with java -jaryou are no longer working with a maven-resolving dependency. You must make sure that all the banks you depend on are available at the relative exemption indicated in the file MANIFEST.mfin your bank. Usually you should use the build plugin to create a distribution archive that creates this structure. Or you can use the uberjar / onejar plugin to include everything in your jar.

+5
source

2 :

1 - "lib" (. outputDirectory) Runnable JAR , (. classpathPrefix)

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>example.MyMainClass</mainClass>
        </manifest>
    </archive>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
    <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
            <goal>copy-dependencies</goal>
        </goals>
        <configuration>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
            <overWriteReleases>false</overWriteReleases>
            <overWriteSnapshots>false</overWriteSnapshots>
            <overWriteIfNewer>true</overWriteIfNewer>
        </configuration>
    </execution>
</executions>


2. maven-assembly-plugin JAR . ( JAR)

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">

<id>with-dependencies</id>
<formats>
    <format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
    <dependencySet>
        <outputDirectory>/</outputDirectory>
        <useProjectArtifact>true</useProjectArtifact>
        <unpack>true</unpack>
        <scope>compile</scope>
    </dependencySet>
</dependencySets>

+4

. Cobertura ( /) -. jar ( / /cobertura ), cobertura.jar . , ClassNotFoundException .

However, since my POM does not contain any hints that are intended classes for packaging, Maven has a free choice ... and he uses a toolbox with tools.

My solution was really simple: mvn clean and mvn package. The first call removes all tool classes. Then the second call finds only the uninstrumented classes without any external references to Cobertura.

0
source

All Articles