我无法使用maven-shade-plugin将maven-plugin-api打包到uber jar中

时间:2015-11-19 13:43:40

标签: java maven maven-shade-plugin

我的pom.xml如下所示:

  <!-- Use shade plugin for uber jar -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.4.2</version>
    <configuration>
    <filters>
     <filter>
       <artifact>maven-plugin-api</artifact>
       <includes>
         <include>org/apache/maven/**</include>
       </includes>
     </filter>
     </filters>
      <shadedArtifactAttached>false</shadedArtifactAttached>
      <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
          <mainClass>com.abc.def.ver.main.Main</mainClass>
        </transformer>
      </transformers>
      <createDependencyReducedPom>false</createDependencyReducedPom>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

但是当我的jar被创建时,我在运行main时遇到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/maven/plugin/descriptor/PluginDescriptor
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
        at java.lang.Class.privateGetMethodRecursive(Class.java:3035)
        at java.lang.Class.getMethod0(Class.java:3005)
        at java.lang.Class.getMethod(Class.java:1771)
        at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.apache.maven.plugin.descriptor.PluginDescriptor
        at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 7 more

我也有依赖

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-plugin-api</artifactId>
  <version>3.2.5</version>
  <scope>provided</scope>
</dependency>

在我的pom。

  1. 它是如何运作的?我的本地存储库中没有maven-plugin-api。是从我的Maven(应用程序)lib文件夹中获取它来运行它,因为它通常运行完美。如果它从我的maven文件夹中获取,我有maven-3.3.1,指定的版本是3.2.5。

  2. 我如何才能让它发挥作用?

2 个答案:

答案 0 :(得分:1)

默认情况下,maven-shade-plugin将忽略所有提供的依赖项。因此,具有maven-plugin-api范围的provided依赖关系将不会保留。

这是预期的:provided dependencies应该在容器运行时可用。有两种解决方案:

  • 从依赖关系声明中删除提供的范围。它将被包含在超级罐中。
  • 保留提供的范围,但在启动应用程序时将maven-plugin-api工件添加到类路径中,以使awk工件可用。

答案 1 :(得分:1)

当你说<scope>provided</scope>时,你说的是不需要包含相关的工件,因为它会&#34;神奇地&#34;在类路径中可用。

有关详细信息,请参阅Difference between maven scope compile and provided for JAR packaging