Переопределить основной класс, указанный в pom. xml при запуске jar из командной строки - PullRequest
1 голос
/ 01 марта 2020

У меня есть 2 класса с основными методами в проекте maven. (NOT SPRING BOOT) класс A и класс B

class A{
    public static void main(String[] args){ 
        System.out.println("CLASS A");
   }
}

class B{
    public static void main(String[] args){ 
        System.out.println("CLASS B");
   }
}

И я указал основной класс по умолчанию в pom следующим образом:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <transformers>
                    <transformer
                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.A</mainClass>
                    </transformer>
                </transformers>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Теперь, когда я запускаю проект, используя java -jar из командной строки, основной метод A выполняется как ожидалось. Команда, которую я использую, выглядит следующим образом:

java -jar myExample-Snapshot.jar

Он запускает класс А, как и ожидалось, поскольку я указал его под <mainClass>com.example.A</mainClass> в моем пом. xml.

Теперь я хочу указать class A или class B, когда я выполняю свой jar из командной строки. Я попробовал следующее,

java -jar myExample-Snapshot.jar com.example.B

Но он запустил класс A (указанный в pom) с com.example.B в качестве аргумента командной строки (хранится в String[] args)

Затем я попытался добавить основной class B для моего pom, как показано ниже:

<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.A</mainClass>
                        <mainClass>com.example.B</mainClass> 
                    </transformer>

команда: java -jar myExample-Snapshot.jar com.example.A

Но на этот раз она побежала main с class B и полностью игнорировалась class A. (Опять же, com.example.A было взято в качестве аргумента командной строки)

Это выполнимо? или я должен подойти к этому другому

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Запуск java с параметром -jar заставит java заглянуть в файл manifest.mf (содержащийся в jar), где указан основной класс, который должен быть выполнен. Очевидно, что ваша установка maven создает этот manifest.mf соответственно для вас.

Запуск java с -cp указывает только на то, в каких jar java следует искать нужные классы. Первый неквалифицированный параметр в строке запуска указывает основной класс, для которого выполняется метод main (). Все остальные параметры передаются методу main как args [].

0 голосов
/ 01 марта 2020

Вот мой pom с плагином Shade, так что я получаю готовую взорванную банку, но без основного метода.

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Теперь у меня есть 2 основных класса:

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

Теперь я получаю взорванную банку, но вместо того, чтобы запускать ее как банку, я запускаю свою главную с банкой, добавленной в путь к классу:

greg@greg-XPS-13-9360:~/work/double-main$ java -cp target/double-main-1.0-SNAPSHOT.jar com.essexboy.App1
Hello World! App 1
greg@greg-XPS-13-9360:~/work/double-main$ java -cp target/double-main-1.0-SNAPSHOT.jar com.essexboy.App2
Hello World! App 2

Вот как выглядит манифест с основным классом

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: greg
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_201
Main-Class: com.essexboy.App1
...