【问题标题】:ClassNotFound exception while using the Maven Shade Plugin使用 Maven Shade 插件时出现 ClassNotFound 异常
【发布时间】:2011-11-13 20:55:38
【问题描述】:

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

我是 Maven 新手。试图效仿这个例子,我觉得有点不够深入。

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

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

编辑:

我可以得到一个shade 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>

【问题讨论】:

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


    【解决方案1】:

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

    • 您用来调用 Shade 的 pom 未显示

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

    • 你没有这样的课程

    • 您应该将 &lt;mainClass&gt;org.sonatype.haven.HavenCli&lt;/mainClass&gt; 中的类名更改为您想用作主类的任何名称

    【讨论】:

      【解决方案2】:

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

      --

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

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

      您可能在 pom 文件中包含了 &lt;plugin&gt; 作为 &lt;project&gt; 的直接子代。它不起作用。

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

      排除: 一般情况下,uber jar 会包含 pom.xml 中dependencies jar 列表中的所有类。 excludes 指定一组不需要位于阴影 jar 中的 jar 文件。如果您仔细查看示例,它会排除 junit:junit jar,这意味着 junit 中的类不会在您的 uber jar 中。

      【讨论】:

        【解决方案3】:

        将以下 sn-p 添加到您的插件中。这应该会有所帮助。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-08
          • 1970-01-01
          • 2017-08-13
          • 2012-09-24
          • 2015-08-20
          • 2011-07-07
          • 1970-01-01
          • 2013-09-29
          相关资源
          最近更新 更多