【问题标题】:Maven Error: Could not find or load main classMaven 错误:无法找到或加载主类
【发布时间】:2015-06-04 15:48:30
【问题描述】:

我正在使用 Java Maven 程序,但我不知道应该输入什么作为 <mainClass>。我已经尝试了基于 numerous stackoverflow questions 的各种事情,但它们并没有解决错误。

每次都说:

Maven Error: Could not find or load main class ...

我在我的pom.xml 里写了这个(减去???

  <build>
  ...
  <plugins>
  ...
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.5.3</version>
        <configuration>
            <descriptors>
                <descriptor>src/main/assembly/jar-with-dependencies.xml</descriptor>
            </descriptors>
            <archive>
                <manifest>
                    <mainClass> ??? </mainClass>
                </manifest>
            </archive>
        </configuration>
        <executions>
            <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            </execution>
        </executions>
    </plugin>
  ...
  </plugins>
  ...
  </build>

如何修复这些错误?

【问题讨论】:

  • 请出示完整的 pom 文件。

标签: java jar maven-2 manifest main


【解决方案1】:

我在使用 Maven 时遇到了这个错误,我找到了解决方案。

Error: Could not find or load main class com.mycompany.testapifactory.Main

我在 Linux 上使用 java JDK 1.7 版,我的 pom.xml 文件是 Netbeans 生成的默认文件,我正在使用这些命令进行编译,这在普通的 hello-world java 应用程序中运行良好:

mvn clean compile
java -jar target/TestAPIFactory-1.0-SNAPSHOT.jar com.mycompany.testapifactory.Main

发生了什么:

原来我的问题是我的 Main 方法正在扩展 Exotic 的东西,像这样:

public class Main extends SomeExoticLibraryClass{
    public static void main(String[] args){
        //...
    }
}

正是这种对主类的扩展导致了上述错误。

TLDR 解决方案:

确保您的主课程没有扩展任何第 3 方课程。将它们重构到自己的类中。该错误消息很糟糕,需要消除过程才能找出要做什么。

【讨论】:

  • 完美解决方案!
  • 我的 JavaFX 项目扩展了 JavaFX 的 Application 类时遇到了这个问题。在删除扩展“修复”问题的同时,似乎使用 Oracle 的 JDK 来运行应用程序而不是我的 Linux 发行版附带的 OpenJDK 修复了它,而无需我更改代码。这可能与扩展类在启动时不可用/加载有关?
  • 救了我一整天!谢谢@Eric
  • 谢谢。很遗憾(对于我们的技术生态系统),我不得不阅读几十个答案才能找到这个。
【解决方案2】:

除非您出于设置 mainClass 以外的原因需要“maven-assembly-plugin”,否则您可以使用“maven-jar-plugin”插件。

     <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <index>true</index>
                    <manifest>
                        <mainClass>your.package.yourprogram.YourMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
     </plugins>

您可以在ATLauncher 中查看该插件的实践。

'mainClass' 元素应设置为您在程序中具有入口点的类,例如:

package your.package.yourprogram;

public class YourMainClass {

    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

【讨论】:

    【解决方案3】:

    对我来说,问题与 Maven 无关,而与我运行 .jar 的方式有关。我编写了一些代码并使用 Maven 将其打包为 .jar。我用它运行它

    java target/gs-maven-0.1.0.jar
    

    并在 OP 中得到错误。实际上你需要-jar 选项:

    java -jar target/gs-maven-0.1.0.jar
    

    【讨论】:

    • 这应该为每个人修复Could not find or load main class 错误
    【解决方案4】:

    请按照下面的sn-p..它有效..

    <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.xyz</groupId>
        <artifactId>test</artifactId>
        <packaging>jar</packaging>
        <version>0.0.1-SNAPSHOT</version>
        <name>TestProject</name>
        <description>Sample Project</description>
        <dependencies>
            <!-- mention your dependencies here -->
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.1.1</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>com.xyz.ABC.</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    请注意,您必须在&lt;mainClass&gt;&lt;/mainClass&gt;标签内提供主类的完整分类类名(类名包括包名,不包括.java.class)。

    【讨论】:

      【解决方案5】:

      我也明白了,对我来说,删除 m2 文件夹 (C:\Users\username.m2) 并更新 maven 项目后问题得到解决。

      【讨论】:

        【解决方案6】:

        我也明白了,关键是将输出文件夹从bin 更改为target\classes。似乎在Eclipse中,将项目转换为Maven项目时,这一步不是自动完成的,但是Maven项目不会根据bin寻找主类,而是会在target\classes上。

        【讨论】:

          【解决方案7】:

          在插件下的pom中指定主类位置

          <build>
                  <plugins>
                      <plugin>
                          <groupId>org.apache.maven.plugins</groupId>
                          <artifactId>maven-jar-plugin</artifactId>
                          <version>2.4</version>
                          <configuration>
                              <archive>
                                  <index>true</index>
                                  <manifest>
                                      <mainClass>com.example.hadoop.wordCount.WordCountApp</mainClass>
                                  </manifest>
                              </archive>
                          </configuration>
                      </plugin>
                  </plugins>
              </build>
          

          【讨论】:

            【解决方案8】:

            将此添加到您的 pom.xml 文件中:

            <configuration>
               <transformers>
                   <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                   <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                     <mainClass>sample.HelloWorldApplication</mainClass>
                   </transformer>
               </transformers>
            </configuration>
            

            并添加项目的类名(完整路径)以及包名,如“com.packageName.className”,其中包含包含“run”方法的主方法。 而不是你的“???”写 ${mainClass} 会自动得到你上面提到的className。

            然后尝试命令 mvn clean installmvn -jar "jar_file_name.jar" server "yaml_file_name.yml"

            希望它能正常工作,服务器会在指定的端口启动。

            【讨论】:

              【解决方案9】:

              我建议的第一件事是使用correct configuration for predefined descriptors

              <project>
                [...]
                <build>
                  [...]
                  <plugins>
                    <plugin>
                      <artifactId>maven-assembly-plugin</artifactId>
                      <version>2.5.3</version>
                      <configuration>
                        <descriptorRefs>
                          <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                      </configuration>
                      [...]
              </project>
              

              要配置主类,您需要知道要使用的类的包和名称,应将其提供给&lt;mainClass&gt;...&lt;/mainClass&gt; 参数。

              另外我推荐给stop using Maven 2 and move to Maven 3 instead

              【讨论】:

                【解决方案10】:

                我得到了这个错误(主类的classNotFoundException),我实际上改变了pom版本,所以maven再次安装然后错误消失了。

                【讨论】:

                  【解决方案11】:

                  TLDR : 检查 pom.xml 文件中的 packaging 元素是否设置为 jar

                  像这样 - &lt;packaging&gt;jar&lt;/packaging&gt;。如果它设置为pom,即使在您清理和构建项目之后也不会创建您的目标文件夹,Maven 可执行文件将无法找到.class 文件(因为它们不存在),之后您会得到@ 987654327@


                  在Netbeans 8.2中创建Maven POM项目后,默认pom.xml文件内容如下-

                  <?xml version="1.0" encoding="UTF-8"?>
                  <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.mycompany</groupId>
                     <artifactId>myproject</artifactId>
                     <version>1.0-SNAPSHOT</version>
                     <packaging>pom</packaging>
                     <properties>
                         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                     </properties>
                  </project>
                  

                  这里packaging 元素设置为pom。因此,target 目录没有创建,因为我们没有启用 maven 将我们的应用程序打包为jar 文件。将其更改为jar 然后清理并构建您的项目,您应该会看到在根位置创建的目标目录。现在您应该可以使用 main 方法运行该 java 文件了。

                  当没有声明打包时,Maven 假定打包为jar。其他核心封装值为pomwarmaven-pluginejbearrar。这些定义了在该包的每个相应构建生命周期阶段执行的目标。查看更多here

                  【讨论】:

                    【解决方案12】:

                    这对我有用....

                    我在 pom.xml 中的属性中添加了以下行

                    <properties>
                        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
                    </properties>
                    

                    【讨论】:

                      【解决方案13】:

                      对我来说,我添加了

                      <packaging>jar</packaging>
                      

                      并删除了默认的 spring-boot-maven-plugin

                      <!-- remove this plugin
                          <plugin> 
                                  <groupId>org.springframework.boot</groupId>
                                  <artifactId>spring-boot-maven-plugin</artifactId>
                          </plugin> -->
                      

                      【讨论】:

                        【解决方案14】:

                        在执行时添加-Xdiag 选项。这是额外的“诊断”。这不会解决问题,但会添加更详细的错误消息和根本原因,以帮助识别问题。

                        【讨论】:

                          【解决方案15】:

                          在极少数情况下,访问路径中的表情符号会导致此类错误。仔细检查您的目录名称,也许一个非标准字符会很有趣!

                          【讨论】:

                            【解决方案16】:

                            在我的情况下,我迟到了,是我使用的图像造成了麻烦

                            工作配置

                            <plugin>
                                        <groupId>com.google.cloud.tools</groupId>
                                        <artifactId>jib-maven-plugin</artifactId>
                                        <version>${jib-maven-plugin.version}</version>
                                        <configuration>
                                            <from>
                                                <image>openjdk:11-jre-slim</image>
                                            </from>
                                            <to>
                                                <image>${docker.image.prefix}/${project.artifactId}</image>
                                            </to>
                                            <container>
                                                <mainClass>com.example.configserverApplication</mainClass>
                                                <ports>
                                                    <port>8888</port>
                                                </ports>
                                            </container>
                                        </configuration>
                                    </plugin>
                            

                            失败一个

                              <plugin>
                                        <groupId>com.google.cloud.tools</groupId>
                                        <artifactId>jib-maven-plugin</artifactId>
                                        <version>${jib-maven-plugin.version}</version>
                                        <configuration>
                                            <from>
                                                <image>openjdk:alpine</image>
                                            </from>
                                            <to>
                                                <image>${docker.image.prefix}/${project.artifactId}</image>
                                            </to>
                                            <container>
                                                <mainClass>com.example.configserverApplication</mainClass>
                                                <ports>
                                                    <port>8888</port>
                                                </ports>
                                            </container>
                                        </configuration>
                                    </plugin>
                            

                            我的理解是这样的

                            “Alpine 的 OpenJDK 端口不在 OpenJDK 支持的版本中,因为它不在主线代码库中。它仅作为 OpenJDK Project Portola 的早期访问版本提供。另见此评论。所以这个图片遵循 OpenJDK 项目维护者提供的内容。”

                            https://hub.docker.com/_/openjdk

                            奇怪的是,它因一行错误而失败,并且更改图像为我修复了它。

                            【讨论】:

                              猜你喜欢
                              • 2020-08-29
                              • 2012-06-22
                              • 2023-02-19
                              • 2017-07-30
                              • 2016-05-21
                              • 2015-12-22
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多