Ошибка Maven: не удалось найти или загрузить основной класс

Я использую программу Java Maven, и я не знаю, что вводить как <mainClass>. Я пробовал всевозможные вещи, основанные на многочисленных qaru.site/info/551617/..., но они не решают ошибку.

Каждый раз, когда он говорит:

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>

Как исправить эти ошибки?

Ответ 1

Если вам не нужен "maven-assembly-plugin" по причинам, отличным от установки mainClass, вы можете использовать плагин " 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");
    }
}

Ответ 2

Я получил эту ошибку с помощью Maven, и я нашел решение.

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

Я использую java JDK версии 1.7 для Linux, мой файл pom.xml был по умолчанию создан Netbeans, и я использовал эти команды для компиляции, которые отлично работают с обычным Java-приложением hello-world:

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

Что произошло:

Оказывается, моя проблема заключалась в том, что мой основной метод расширил что-то экзотическое:

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

Именно это расширение основного класса вызвало указанную выше ошибку.

Решение TL;DR:

Убедитесь, что ваш основной класс не расширяет сторонние классы. Рефакторинг тех, кто выходит и уходит в свои классы. Это сообщение об ошибке ужасно и требует процесса устранения, чтобы выяснить, что делать.

Ответ 3

Я тоже получил его, ключ должен был изменить выходную папку с bin на target\classes. Кажется, что в Eclipse при преобразовании проекта в проект Maven этот шаг не выполняется автоматически, но проект Maven не будет искать основной класс на основе bin, но будет на target\classes.

Ответ 4

Я получил это тоже, для меня проблема была решена после удаления папки m2 (C:\Users\username.m2) и обновления проекта maven.

Ответ 5

Первое, что я хотел бы предложить, - использовать правильную конфигурацию для предопределенных дескрипторов.

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

Кроме того, я рекомендую остановить использование Maven 2 и вместо этого перейти на Maven 3.

Ответ 6

указать расположение основного класса в пом под плагинами

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

Ответ 7

Для меня проблема заключалась не в Maven, а в том, как я управлял .jar. Я написал некоторый код и упаковал его как .jar с Maven. Я управлял этим с

java target/gs-maven-0.1.0.jar

и получил ошибку в ОП. На самом деле вам нужна опция -jar:

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

Ответ 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}, который автоматически получит имя класса, которое вы упомянули выше.

Затем попробуйте команду mvn clean install и mvn -jar "jar_file_name.jar" сервер "yaml_file_name.yml"

Я надеюсь, что он будет работать нормально, и сервер будет запускаться на указанном порту.

Ответ 9

Я получил эту ошибку (classNotFoundException для основного класса), я фактически изменил версию pom, поэтому снова установил maven, а затем ошибка исчезла.

Ответ 10

Пожалуйста, следуйте приведенному ниже фрагменту.. это работает..

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