【问题标题】:Create runnable jar with maven 3.1 using maven-dependency-plugin doesn't create runnable jar使用 maven-dependency-plugin 使用 maven 3.1 创建可运行 jar 不会创建可运行 jar
【发布时间】:2014-04-01 13:24:04
【问题描述】:

使用 Maven 3.1
日食赫利俄斯

方面:

尝试使用 maven-jar/dependency-plugins 创建一个可运行的 jar 文件。

问题: 创建 jar 文件和依赖项后,当我尝试使用命令启动 jar 文件时出现 NoCLassDefFoundErrors

  java -jar program.jar

但是类/文件在 ./dependency-jars 文件夹中可用??? 我还尝试了以下命令:

  java -cp ./dependency-jars -jar program.jar

这也没有用。

问题:

你知道为什么jvm找不到这些类吗?怎么了?

pom.xml:

<build>
    <finalName>program</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.9</version>
            <configuration>
                <downloadSources>true</downloadSources>
                <downloadJavadocs>true</downloadJavadocs>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>${jdk.version}</source>
                <target>${jdk.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>

                    <manifest>

                        <addClasspath>true</addClasspath>
                        <classpathPrefix>dependency-jars/</classpathPrefix>
                        <mainClass>de.test.MainCLass</mainClass>
                    </manifest>
                </archive>
                <outputDirectory>${package-target-folder}</outputDirectory>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.9.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>javadoc</goal>
                    </goals>
                    <phase>package</phase>
                    <id>create-javadoc</id>
                    <configuration>
                        <charset>UTF-8</charset>
                        <outputDirectory>${package-target-folder}/docs</outputDirectory>
                        <reportOutputDirectory>${package-target-folder}/docs</reportOutputDirectory>

                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.8</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${package-target-folder}/dependency-jars/</outputDirectory>
                    </configuration>
                </execution>
                <execution>


                </execution>
            </executions>
        </plugin>

    </plugins>
</build>

[更新]

创建的 MANIFEST.MF 看起来像

Manifest-Version: 1.0
Built-By: ahausden
Build-Jdk: 1.7.0_25
Class-Path: dependency-jars/spring-core-4.0.0.RELEASE.jar dependency-j
ars/commons-logging-1.1.1.jar dependency-jars/spring-jdbc-4.0.0.RELEA
SE.jar dependency-jars/spring-beans-4.0.0.RELEASE.jar dependency-jars
/spring-tx-4.0.0.RELEASE.jar dependency-jars/spring-oxm-4.0.0.RELEASE
.jar dependency-jars/spring-batch-core-2.2.0.RELEASE.jar dependency-j
ars/xstream-1.3.jar dependency-jars/xpp3_min-1.1.4c.jar dependency-ja
rs/jettison-1.1.jar dependency-jars/spring-aop-3.2.0.RELEASE.jar depe
ndency-jars/spring-context-3.2.0.RELEASE.jar dependency-jars/spring-e
xpression-3.2.0.RELEASE.jar dependency-jars/spring-batch-infrastructu
re-2.2.0.RELEASE.jar dependency-jars/spring-retry-1.0.2.RELEASE.jar d
ependency-jars/spring-batch-test-2.2.0.RELEASE.jar dependency-jars/co
mmons-io-1.4.jar dependency-jars/commons-dbcp-1.2.2.jar dependency-ja
rs/commons-pool-1.3.jar dependency-jars/commons-collections-3.2.jar d
ependency-jars/spring-test-4.0.0.RELEASE.jar dependency-jars/javax.in
ject-1.jar dependency-jars/slf4j-log4j12-1.6.1.jar dependency-jars/sl
f4j-api-1.6.1.jar dependency-jars/log4j-1.2.16.jar dependency-jars/sp
ring-orm-4.0.0.RELEASE.jar dependency-jars/aopalliance-1.0.jar depend
ency-jars/mariadb-java-client-1.1.1.jar dependency-jars/hibernate-cor
e-4.3.1.Final.jar dependency-jars/jboss-logging-3.1.3.GA.jar dependen
cy-jars/jboss-logging-annotations-1.2.0.Beta1.jar dependency-jars/jbo
ss-transaction-api_1.2_spec-1.0.0.Final.jar dependency-jars/dom4j-1.6
.1.jar dependency-jars/xml-apis-1.0.b2.jar dependency-jars/hibernate-
commons-annotations-4.0.4.Final.jar dependency-jars/hibernate-jpa-2.1
-api-1.0.0.Final.jar dependency-jars/javassist-3.18.1-GA.jar dependen
cy-jars/antlr-2.7.7.jar dependency-jars/jandex-1.1.0.Final.jar depend
ency-jars/hibernate-annotations-3.5.6-Final.jar dependency-jars/hiber
nate-commons-annotations-3.2.0.Final.jar dependency-jars/hibernate-jp
a-2.0-api-1.0.0.Final.jar dependency-jars/javassist-3.12.1.GA.jar dep
endency-jars/commons-cli-1.3-20140221.042048-103.jar
Created-By: Apache Maven 3.1.0
Main-Class: de.test.MainClass
Archiver-Version: Plexus Archiver

最后一个“行”作为行分隔符。好像 MANIFEST.MF 文件看起来有点损坏,不是吗?

【问题讨论】:

  • 删除文件系统中的 .m2 文件夹,然后再次清理项目并重建。它对我有用
  • 依赖 pugin 不适用于此类目的。

标签: java eclipse maven jar noclassdeffounderror


【解决方案1】:

您确定在命令行启动的 java 版本等于或大于 maven 在编译时使用的版本吗?试试java -version

【讨论】:

  • 是的,已经检查过了。我的电脑上只有一个 java 版本,和我开发的完全一样
  • 那么,NoCLassDefFoundErrors 是哪个类? de.test.MainCLass?
  • 线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(来源不明)
  • 但是 jar 文件 commons-cli-1.3-SNAPSHOT.jar(其中缺少的类在其中)仍然保留在 ./dependency-jars 文件夹中
  • 似乎 org/apache/commons/cli/ParseException 不在 maven 中:search.maven.org/…
【解决方案2】:

尝试提供清单文件的入口:

Main-Class: YourClassWithMainMethod

另见this post。所以你可以手动制作,看看有什么不同。

如果dependency-jars 是一个目录也试试:

java -cp ./dependency-jars/* -jar program.jar

我仍然无法发布 cmets,所以请显示这些 NoCLassDefFoundErrors 是什么。 您是否尝试过从 Eclipse 手动执行相同的 jar 文件并查看差异?

您的清单中有依赖项dependency-jars/commons-cli-1.3-20140221.042048-103.jar,但您在目录中写了您的SNAPSHOT版本。而且maven central只有commons-cli:commons-cli:20040117.000000。

@robermann 请参阅this post(不过,它应该用双引号括起来)

【讨论】:

  • 已经做到了。 MANIFEST.MF 中的 MainClass 是正确的。问题还在于我必须用 maven 创建 jar。没有其他选择
  • '-cp ./dependency-jars/*' 不起作用,必须明确 jar 名称
  • @Andrei Kuziakov 谢谢,我错过了 java 6 的增强 :)
【解决方案3】:

不确定发生了什么,但这就是我的 pom 使用 shade 构建可运行 jar 的样子:

 <build>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <filtering>false</filtering>
                <includes>
                    <include>schema.xsd</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <shadedArtifactAttached>true</shadedArtifactAttached>
                    <shadedClassifierName>stand-alone</shadedClassifierName>
                    <artifactSet>
                        <excludes>
                            <exclude>org.slf4j:slf4j-api:jar:</exclude>
                            <exclude>org.slf4j:slf4j-log4j12:jar:</exclude>
                            <exclude>org.slf4j:jcl-over-slf4j:jar:</exclude>
                            <exclude>commons-logging:commons-logging:jar:</exclude>
                            <exclude>commons-logging:commons-logging-api:jar:</exclude>
                        </excludes>
                    </artifactSet>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                    <finalName>MyFinalRunnableJarName</finalName>
                    <transformers>
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>class.with.main.Method</mainClass>
                        </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>
            </plugin>
        </plugins>
    </build>

【讨论】:

  • 好的。似乎使用 shade-plugin 解决了这个问题。但是现在注入 org.hibernate.SessionFactory 还有一个问题。我会努力寻找解决方案。现在源头问题解决了。谢谢!
  • 感谢 Shade 的建议,这对我创建一个带有 Spring 依赖项的可执行 .jar 很有用。
【解决方案4】:

通过命令行,转到“dependency-jars”的父目录并运行:java -jar program.jar

【讨论】:

  • 应该包含文件'./dependency-jars/commons-cli-1.3-20140221.042048-103.jar'
【解决方案5】:

最简单的解决方案是像这样使用maven-assembly-plugin

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <!-- NOTE: We don't need a groupId specification because the group is
             org.apache.maven.plugins ...which is assumed by default.
         -->
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        [...]
</project>

【讨论】:

  • 好的,这是一个很好的解决方案。但现在我对 spring 有另一个问题,即上下文找不到“bean”的声明。但是感谢第一个解决方案
【解决方案6】:

好的,我解决了第二个/更新的问题:

我首先开始使用带有 maven 插件的 eclipse 来创建可运行的 jar 文件。这在所描述的问题中运行。

毕竟我尝试从控制台应用程序中使用 maven 3.1 并且它仍然有效。 看来eclipse maven插件有些问题。

【讨论】:

    【解决方案7】:

    使用此命令创建任何 maven 项目的 jar 文件。

    mvn clean compile install

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 2017-07-07
      • 2020-12-02
      • 1970-01-01
      • 2011-01-02
      • 2019-10-16
      • 2018-03-18
      相关资源
      最近更新 更多