java.lang.NoClassDefFoundError: com/google/inject/Module using Guice

Tags: , ,



I am trying to use the DI mechanism provided by Google, but when I run my application, I am getting the following error:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/inject/Module
at challenge.App.main(App.java:19)
Caused by: java.lang.ClassNotFoundException: com.google.inject.Module
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)
... 1 more

The pom.xml file looks like:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
      <version>4.1.0</version>
      <classifier>no_aop</classifier>
    </dependency>
  </dependencies>

And the code where I am using it looks like:

    Injector injector = Guice.createInjector(new DependenciesModule());
    IndexerController indexer = injector.getInstance(IndexerController.class);

And I have imported com.google.inject.Guice and com.google.inject.Injector

I have been checking for several places but I cannot see any relevant solution for this problems, I would appreciate a lot any glue.

Answer

This appears like the usual issue with Maven in that at runtime, the dependency classes (e.g. the Guice classes) are not available to the JVM.

The easiest solution is to use explicit classpath specification while running your app:

java -cp 
/path/to/guice.jar:
/path/too/your-app.jar:
/path/to/other/classes/not/bundled/in/your-app.jar 
main.MyClass

(this is all on one line, split for better viewing).

The other solution is to use Maven Shade Plugin which facilitates the creation of the executable JAR which you can simply run as java -jar uber.jar.



Source: stackoverflow