首页 > 解决方案 > Intellj多模块maven项目找不到主类

问题描述

我正在尝试 maven 多模块项目https://github.com/shekharkhairnar/maven-multimodule-example

以下是我的项目结构:

在此处输入图像描述

mvn clean install在父项目上做了,然后搬到了 sktech-busness/target 和

当我执行java -jar sktech-business-1.0-SNAPSHOT.jar

我越来越no main manifest attribute, in sktech-business-1.0-SNAPSHOT.jar

我尝试过使用 maven 程序集插件、shad 插件但不使用

- 编辑 - -

在“konstantin-annikov”发表评论后,我将 maven-jar-plugin 添加到 sktech-business pom 文件中:

<build>
        <plugins>
            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>org.sktech.business.BusinessTest</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

但是在运行 jar 时出现异常:

Exception in thread "main" java.lang.NoClassDefFoundError: org/sktch/domain/Student
        at org.sktech.business.BusinessTest.main(BusinessTest.java:12)
Caused by: java.lang.ClassNotFoundException: org.sktch.domain.Student
        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)
        ... 1 more

任何帮助是极大的赞赏。

标签: javamavenintellij-idea

解决方案


让我们检查您的清单文件。您可以使用任何解压缩实用程序简单地解压缩您的 .jar 文件。(jar 格式基于流行的 ZIP 格式)。

当我打开sktech-business-1.0-SNAPSHOT/META-INF/MANIFEST.MF我看到以下内容:

清单.MF:

Manifest-Version: 1.0
Created-By: Apache Maven 3.5.0
Built-By: guicey
Build-Jdk: 11.0.5
Class-Path: lib/sktech-domain-1.0-SNAPSHOT.jar
Main-Class: org.sktech.business.BusinessTest

您的应用程序期望在 lib/sktech-domain-1.0-SNAPSHOT.jar 中找到额外的 java 类来运行您的应用程序。因此,运行以下命令java -jar sktech-business-1.0-SNAPSHOT.jar的目录应该有一个 lib 目录,其中包含一个名为 sktech-domain-1.0-SNAPSHOT.jar 的文件。

如果您不想复制/移动目录,可以使用以下 maven 插件将所有依赖类复制到 jar-with-dependencies。将以下代码段添加到 Main-Class 所在模块中的 pom.xml 文件中:maven-multimodule-example/sktech-business/pom.xml。

maven-assembly-plugin 片段:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>org.sktech.business.BusinessTest</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
</build>

您可以通过执行以下命令来运行带有依赖项的 jar:java -jar sktech-business-1.0-SNAPSHOT-jar-with-dependencies.jar

程序输出:

[ComplimentryCourse(id=1, name=Java 8 Fetures), ComplimentryCourse(id=2, name=Advance Java), ComplimentryCourse(id=3, name=Spring Boot), ComplimentryCourse(id=4, name=Database Management)]

推荐阅读