【问题标题】:Maven java project builds, but doesn't runMaven java项目构建,但不运行
【发布时间】:2019-11-04 20:46:40
【问题描述】:

我正在从头开始创建一个 maven 项目,首先学习如何使用 maven。 主项目不包含源代码文件,但它有两个模块(app 和 util)。应用程序取决于实用程序。我想从应用程序中获得一个 .jar,并且如果可能的话没有清单文件。 我可以使用 mvn clean install 编译整个项目,但无法从控制台运行应用程序。

主项目.pom是

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.proba</groupId>
  <artifactId>myproject</artifactId>
  <version>0.0.1</version>
<packaging>pom</packaging>


<modules>
  <module>util</module>
  <module>app</module>
</modules>
</project>

Util .pom

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd" 
xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.proba</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1</version>
  </parent>
  <artifactId>util</artifactId>


 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
     </dependency>
 </dependencies>

</project>

app pom

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.proba</groupId>
        <artifactId>myproject</artifactId>
        <version>0.0.1</version>
    </parent>
    <artifactId>app</artifactId>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.proba</groupId>
            <artifactId>util</artifactId>
            <version>0.0.1</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.proba.app.App</mainClass>
                            <addClasspath>true</addClasspath>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.1.1</version>
                <executions>
                    <execution>
                        <phase>site-deploy</phase>
                        <goals>
                            <goal>java</goal>
                        </goals>
                        <configuration>
                            <mainClass>com.proba.app.App</mainClass>
                            <!--<arguments> <argument>myArg1</argument> <argument>myArg2</argument> 
                                </arguments> -->
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

代码没有做太多。 App.java(在 app 模块内)是 包 com.proba.app;

import com.proba.util.UtilClass;
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        UtilClass uc = new UtilClass(); 
        System.out.println( "QQQQQ: " + uc.print() );
    }
}

我用它编译

mvn clean install
[INFO] Reactor Summary:
[INFO]
[INFO] myproject .......................................... SUCCESS [  0.406 s]
[INFO] util ............................................... SUCCESS [  2.074 s]
[INFO] app ................................................ SUCCESS [  0.535 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

myproject, util, app 是成功的。

我尝试运行它

java -jar app/target/app-0.0.1.jar
Hello World!
Exception in thread "main" java.lang.NoClassDefFoundError: com/proba/util/UtilClass
        at com.proba.app.App.main(App.java:17)
Caused by: java.lang.ClassNotFoundException: com.proba.util.UtilClass
        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

如您所见,Hello World!打印出来了,但是没有找到UtilClass。 我能够从 Eclipse 运行构建,但不能从控制台运行。 我做错了什么?你有什么想法吗?

【问题讨论】:

  • 如果从控制台运行构建会发生什么?
  • 尝试直接从目标目录运行 jar - 我猜它与 util jar 相对于当前工作目录的位置有关。
  • Gimby:为此我得到相同的结果: cd util/target/ 然后 java -jar ../../app/target/app-0.0.1.jar Hello World!线程“主”java.lang.NoClassDefFoundError 中的异常:com/proba/util/UtilClass
  • JF Meier:我从控制台运行它,即当我看到 NoClassDefFoundError 时

标签: java maven noclassdeffounderror


【解决方案1】:

你缺少的是 UtilClass 的 jar。你只需要在你的 pom.xml 中添加 shade 插件。 作为参考:maven-shade-plugin

【讨论】:

  • 您能说得更具体些吗?我应该在哪个pom中添加它?实用程序或应用程序或主项目。
  • @thamas 主项目
  • 太棒了!这解决了它。现在我在控制台中得到了预期的打印输出:“java -jar app/target/app-0.0.1.jar Hello World!QQQQQ:来自 Module Util 的 Hello World!”非常感谢! (接受了这个答案。)
【解决方案2】:

在 app 模块的 pom.xml 中,你已经编写了编译,这就是为什么在运行时你的 jar 没有进入类路径。删除编译行。它会工作。

【讨论】:

  • 我试过不用它,用提供的等等。这些都行不通。
【解决方案3】:

Util.jar 作为依赖项添加到您的应用程序 pom.xml 中,但范围是可编译的。所以它不会作为类路径条目添加到您的清单中。删除范围元素,然后尝试。

【讨论】:

  • java -cp util/target/util-0.0.1.jar -jar app/target/app-0.0.1.jar 不幸地给出了相同的结果。据我所知,java忽略“-cp”是使用“-jar”。
  • 广泛记载的是,在使用 -jar 运行应用程序时,-cp 无效。类路径在 jar 的清单中定义,因此只需双击可运行的 jar,它也可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2018-02-23
相关资源
最近更新 更多