Reputation: 967
I am currently building a small java application using Apache POI and docx4j which protects a word document. When building and running the Maven project in my IDE (Netbeans 8.1) is executes.
When starting the class from the command-line a java.lang.NoClassDefFoundError
for org/docx4j/openpackaging/exceptions/Docx4JException
is thrown
$ java -jar DocxProtect-1.0-SNAPSHOT.jar Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: org/docx4j/openpackaging/exceptions/Docx4JException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.privateGetMethodRecursive(Class.java:3048) at java.lang.Class.getMethod0(Class.java:3018) at java.lang.Class.getMethod(Class.java:1784) at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) Caused by: java.lang.ClassNotFoundException: org.docx4j.openpackaging.exceptions.Docx4JException at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 7 more
I do build a fat-jar using maven which includes all the dependencies. When running the project from the IDE it is using the following command;
/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bin/java -classpath /Users/petervannes/NetBeansProjects/DocxProtect/target/classes:/Users/petervannes/.m2/repository/org/apache/poi/poi/3.14/poi-3.14.jar:/Users/petervannes/.m2/repository/commons-codec/commons-codec/1.10/commons-codec-1.10.jar:/Users/petervannes/.m2/repository/org/docx4j/docx4j/3.2.2/docx4j-3.2.2.jar:/Users/petervannes/.m2/repository/org/plutext/jaxb-svg11/1.0.2/jaxb-svg11-1.0.2.jar:/Users/petervannes/.m2/repository/org/plutext/jaxb-xslfo/1.0.1/jaxb-xslfo-1.0.1.jar:/Users/petervannes/.m2/repository/org/plutext/jaxb-xmldsig-core/1.0.0/jaxb-xmldsig-core-1.0.0.jar:/Users/petervannes/.m2/repository/net/engio/mbassador/1.1.10/mbassador-1.1.10.jar:/Users/petervannes/.m2/repository/org/slf4j/slf4j-api/1.7.5/slf4j-api-1.7.5.jar:/Users/petervannes/.m2/repository/org/slf4j/jcl-over-slf4j/1.7.5/jcl-over-slf4j-1.7.5.jar:/Users/petervannes/.m2/repository/org/slf4j/slf4j-log4j12/1.7.5/slf4j-log4j12-1.7.5.jar:/Users/petervannes/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar:/Users/petervannes/.m2/repository/commons-lang/commons-lang/2.4/commons-lang-2.4.jar:/Users/petervannes/.m2/repository/commons-io/commons-io/1.3.1/commons-io-1.3.1.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/xmlgraphics-commons/1.5/xmlgraphics-commons-1.5.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/fop/1.1/fop-1.1.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-svg-dom/1.7/batik-svg-dom-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-anim/1.7/batik-anim-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-css/1.7/batik-css-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-dom/1.7/batik-dom-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-parser/1.7/batik-parser-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-util/1.7/batik-util-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-bridge/1.7/batik-bridge-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-script/1.7/batik-script-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-js/1.7/batik-js-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-xml/1.7/batik-xml-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-awt-util/1.7/batik-awt-util-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-gvt/1.7/batik-gvt-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-transcoder/1.7/batik-transcoder-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-svggen/1.7/batik-svggen-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-extension/1.7/batik-extension-1.7.jar:/Users/petervannes/.m2/repository/org/apache/xmlgraphics/batik-ext/1.7/batik-ext-1.7.jar:/Users/petervannes/.m2/repository/org/apache/avalon/framework/avalon-framework-api/4.3.1/avalon-framework-api-4.3.1.jar:/Users/petervannes/.m2/repository/org/apache/avalon/framework/avalon-framework-impl/4.3.1/avalon-framework-impl-4.3.1.jar:/Users/petervannes/.m2/repository/xalan/xalan/2.7.1/xalan-2.7.1.jar:/Users/petervannes/.m2/repository/xalan/serializer/2.7.1/serializer-2.7.1.jar:/Users/petervannes/.m2/repository/net/arnx/wmf2svg/0.9.0/wmf2svg-0.9.0.jar:/Users/petervannes/.m2/repository/org/apache/poi/poi-scratchpad/3.8/poi-scratchpad-3.8.jar:/Users/petervannes/.m2/repository/org/antlr/antlr-runtime/3.3/antlr-runtime-3.3.jar:/Users/petervannes/.m2/repository/org/antlr/stringtemplate/3.2.1/stringtemplate-3.2.1.jar:/Users/petervannes/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar:/Users/petervannes/.m2/repository/com/google/guava/guava/17.0/guava-17.0.jar com.reddipped.docxprotect.DocxProtect
So instead of executing the fat jar is executes the compiled classed and uses the classes from the lib folder in the project.
I have compared all classes in the MANIFEST of the fat-jar and the classpath when executing from Netbeans. Both are the same. What is surprising me is that the NoClassDefFoundError is thrown for a class in a jar which is included.
Any ideas, hints, tips how to resolve this? Cheers, Peter
== Update 1 ==
The format of the classpath in the MANIFEST.MF seems to be odd. Each new line of the classtpath seems to have an indentation character which brakes the paths of the jars.
According to the JAR File Specification there should spaces between jar files, not IN the file names.
Class-Path: The value of this attribute specifies the relative URLs of the extensions or libraries that this application or extension needs. URLs are separated by one or more spaces. The application or extension class loader uses the value of this attribute to construct its internal search path.
Manifest-Version: 1.0 Built-By: petervannes Class-Path: lib/poi-3.14.jar lib/commons-codec-1.10.jar lib/docx4j-3.2 .2.jar lib/jaxb-svg11-1.0.2.jar lib/jaxb-xslfo-1.0.1.jar lib/jaxb-xml dsig-core-1.0.0.jar lib/mbassador-1.1.10.jar lib/slf4j-api-1.7.5.jar lib/jcl-over-slf4j-1.7.5.jar lib/slf4j-log4j12-1.7.5.jar lib/log4j-1. 2.17.jar lib/commons-lang-2.4.jar lib/commons-io-1.3.1.jar lib/xmlgra phics-commons-1.5.jar lib/fop-1.1.jar lib/batik-svg-dom-1.7.jar lib/b atik-anim-1.7.jar lib/batik-css-1.7.jar lib/batik-dom-1.7.jar lib/bat ik-parser-1.7.jar lib/batik-util-1.7.jar lib/batik-bridge-1.7.jar lib /batik-script-1.7.jar lib/batik-js-1.7.jar lib/batik-xml-1.7.jar lib/ batik-awt-util-1.7.jar lib/batik-gvt-1.7.jar lib/batik-transcoder-1.7 .jar lib/batik-svggen-1.7.jar lib/batik-extension-1.7.jar lib/batik-e xt-1.7.jar lib/avalon-framework-api-4.3.1.jar lib/avalon-framework-im pl-4.3.1.jar lib/xalan-2.7.1.jar lib/serializer-2.7.1.jar lib/wmf2svg -0.9.0.jar lib/poi-scratchpad-3.8.jar lib/antlr-runtime-3.3.jar lib/s tringtemplate-3.2.1.jar lib/antlr-2.7.7.jar lib/guava-17.0.jar Created-By: Apache Maven 3.0.5 Build-Jdk: 1.8.0_60
Upvotes: 0
Views: 1104
Reputation: 967
Solved it, initially started with the maven-jar-plugin to build the jar. After replacing this plugin with the maven-shade-plugin 2.4.3 the jar ran without issues. Possibly 6 overlapping classes were causing the issue.
Upvotes: 1