使用Maven Shade插件时出现ClassNotFound异常

时间:2011-09-09 14:42:44

标签: java maven maven-2 maven-shade-plugin

我正在尝试关注此链接: http://maven.apache.org/plugins/maven-shade-plugin/examples.html

我是Maven的新手。我试图效仿这个例子,感觉有点过分了。

我能够让Quartz Scheduler使用Spring。我希望能够使用jar文件从命令行运行它。

以下是我使用的类和pom文件的列表。

shade maven plugin

编辑:

我能够获得一个阴影jar文件。我用过mvn clean install

但是当我尝试从命令行运行它时,我收到以下错误。

C:\Users\SpringExample\target>java -jar SpringExample-1.0-SNA PSHOT-shaded.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/sonatype/haven/Ex odusCli Caused by: java.lang.ClassNotFoundException: org.sonatype.haven.ExodusCli at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: org.sonatype.haven.ExodusCli. Program will exit.

EDIT2:

我使用此链接在上面的pom中使用了以下内容:

http://seanfreitag.wordpress.com/2011/07/25/create-an-executable-jar-with-dependencies-using-maven/

 <project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.4</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <manifestEntries>
                    <Main-Class>org.sonatype.haven.ExodusCli</Main-Class>
                    <Build-Number>123</Build-Number>
                  </manifestEntries>
                </transformer>
                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>META-INF/spring.handlers</resource>
                </transformer>
                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>META-INF/spring.schemas</resource>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

3 个答案:

答案 0 :(得分:2)

我没有使用过Shade,但我怀疑:

  • 用于调用Shade的pom未显示

  • 显示如何设置Main-Class的Maven示例假定类org.sonatype.haven.HavenCli位于正在组装的jar中的某个位置

  • 你没有这样的课程

  • 您应该将<mainClass>org.sonatype.haven.HavenCli</mainClass>中的班级名称更改为您要用作主班级的名称

答案 1 :(得分:1)

更新:您需要在jar中的Manifest.mf中指定Main-Class属性。请参阅示例“Shade Plugin,其中Main-Class被添加到MANIFEST.MF”。

-

是的,您应该将插件代码嵌入到您的pom文件中,如下所示

<project>
       <!-- Other tags -->
        ---
    <build>
      <plugins>
        <plugin>
           ---
        </plugin>
      </plugins>
    </build>`
</project>

您可能已将<plugin>作为<project>的直接子项包含在pom文件中。它不起作用。

如果指定了shade插件配置,使用mvn install(或mvn package)构建maven项目的常用方法将创建阴影jar。那么,会有两个罐子;原来的罐子和超级罐子。

排除: 通常,超级jar将包含pom中dependencies jar列表中的所有类。 excludes指定一组不需要在着色jar中的jar文件。如果你仔细看看这个例子,它会排除junit:junit jar,这意味着junit中的类不会出现在你的超级jar中。

答案 2 :(得分:0)

将以下代码段添加到您的插件中。这应该有帮助。

 <artifactSet>
    <includes>
        <include>org.sonatype.haven.ExodusCli:*</include>
    </includes>
 </artifactSet>