Maven错误:无法找到或加载主类

时间:2015-03-31 10:24:49

标签: java jar maven-2 manifest main

我使用的是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>

如何修复这些错误?

15 个答案:

答案 0 :(得分:13)

除非你需要&#39; maven-assembly-plugin&#39;除了设置mainClass之外的其他原因,您可以使用&#39; maven-jar-plugin&#39;插件。

     <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

中查看插件

&#39; mainClass&#39; element应设置为您具有程序入口点的类,例如:

package your.package.yourprogram;

public class YourMainClass {

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

答案 1 :(得分:10)

使用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解决方案:

确保您的主要课程不会扩展任何第三方课程。把它们重新组合成自己的课程。该错误消息很糟糕,需要消除过程以找出要做的事情。

答案 2 :(得分:1)

我也得到了它,关键是将输出文件夹从bin更改为target\classes。似乎在Eclipse中,当将项目转换为Maven项目时,此步骤不会自动完成,但Maven项目不会基于bin查找主类,而是查找target\classes上的主类。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我建议的第一件事是使用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>

要配置主类,您需要知道要使用的类的包和名称,这些类应该被赋予<mainClass>...</mainClass>参数。

此外,我建议stop using Maven 2 and move to Maven 3 instead

答案 5 :(得分:0)

在插件下的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>

答案 6 :(得分:0)

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

java target/gs-maven-0.1.0.jar

并在OP中得到错误。实际上,您需要使用-jar选项:

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

答案 7 :(得分:0)

将此添加到您的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全新安装命令和 mvn -jar“ jar_file_name.jar”服务器“ yaml_file_name.yml”

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

答案 8 :(得分:0)

我遇到了这个错误(主类为classNotFoundException),实际上我更改了pom版本,所以maven重新安装,然后错误消失了。

答案 9 :(得分:0)

请按照以下代码段进行操作。.

<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>

请注意,您必须在.java标签内提供主类的完整分类类名(类名,包括没有.class<mainClass></mainClass>的包名。)

答案 10 :(得分:0)

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

像这样-<packaging>jar</packaging>。如果将其设置为pom,即使在清理并生成项目后,您的目标文件夹也不会创建,并且Maven可执行文件将无法找到.class文件(因为它们不存在),之后您会得到Error: Could not find or load main class your.package.name.MainClass


在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

答案 11 :(得分:0)

这对我有用。...

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

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

答案 12 :(得分:0)

对我来说,我加了

<packaging>jar</packaging>

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

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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