Подтвердить что ты не робот

Несколько запущенных классов внутри JAR, как их запустить?

У меня возникают проблемы с запуском нескольких разных классов из одного JAR файла. Я знаю, что я могу установить один из классов внутри JAR классом Main, который будет запущен после команды java -jar myjar.jar, но я хочу что-то вроде:

java -jar myjar.jar MyClass

Можно ли это сделать так, или мне нужно создать несколько JAR (каждый для одного запускаемого класса), или лучше создать класс "manager", который будет запускать мои другие классы, передавая им аргументы командной строки?
Я искал документацию или ссылку, но я не мог найти ее.

4b9b3361

Ответ 1

Формат исполняемого Jar файла позволяет указать только один основной класс. Для того, чтобы вы могли выполнять разные приложения, вам нужно либо создать "менеджер", как вы предлагаете, либо вместо него использовать classpath:

java -cp myjar.jar MyClass

Однако этот подход будет игнорировать путь к классам, который вы настроили в файле манифеста Jar.

Ответ 2

вам нужно будет использовать:

java -cp myjar.jar MyClass

и

java -cp myjar.jar OtherMainClass

Ответ 3

Вы делаете это так:

java -cp myjar.jar MyClass

то есть. поместите JAR в путь к классам, тогда любой класс с основным методом может быть запущен, указав его полное имя. Опция -jar существует только в виде ярлыка для использования информации в манифесте JAR (которая также может включать другие JAR в пути к классам, а также указать основной класс).

Ответ 4

Не лучше ли вам лучше использовать основной класс "Launcher", функция которого состоит в том, чтобы просто отправлять вызовы фактическим классам контроллеров и использовать файл ссылок в качестве окончательной обертки вместо того, чтобы возиться с -cp вариант wm?

В окнах это удивительно легко сделать.

"Основной класс" не должен быть чем-то сложным, что-то вроде

/**
 * Sample launcher
 */
public class Launcher {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        if (args != null && args.length > 0) {
            String option= args[0]; 
            String[] args2=new String[0];               

            if( args.length>1){
                args2= new String[args.length-1];
                System.arraycopy(args, 1, args2, 0, args2.length); 
            }

            if(option.equals("a"));                 
                new ClassA().exec(args2);
            else if(option.equals("b"));                
                new ClassB().exec(args2);


        }
    }
}

На стороне окна вещей достаточно чего-то типа создания ссылки такого типа

javaw.exe -jar "jarfile" "a"

Это очень полезно для размещения ссылки в папке "sendTo"... одна банка, скрытая, вызываемая многими ссылками, которые активируют один из ее аспектов, упрощает развертывание обновлений логики jar.

Фактические выбранные файлы передаются как список строк после параметров в определении ссылки.

Таким образом, вы не должны беспокоиться о проблемах всего класса.

Ответ 5

Этот doc поможет вам.

Ответ 6

Как только правильный ответ был предоставлен, есть решение, которое вы могли бы использовать, чтобы создать банку заглушки для каждого основного класса с различными манифестами. Это позволит вам создавать исполняемые файлы jar, позволяя двойным щелчком для каждой отдельной программы.

Существует несколько способов достижения этого, но основы должны состоять в том, что один класс похож на следующий, который вызывает предполагаемый основной метод, передающий args.

package com.acme.myapp;

public final class Stub1 {
    public static void main(String[] args) {
        App1.main(args);
    }
}

Что касается упаковки этого, один из способов использования maven был бы с maven-assembly-plugin: jar-with-dependencies mojo. Преимущество здесь в том, что mojo построит банку для основного основного метода, который является автономным и не нуждается в других сборках в пути к классам. Он делает это, копируя содержимое каждой баны зависимости в результирующую банку.

Ответ 7

Файлы Jar могут содержать только один атрибут Main-Class в манифесте, что означает, что java -jar myjar.jar может запускать только один класс.

Вы можете запускать другие классы runnable с помощью

java -cp myjar.jar OtherClass

но это не поможет пользователям дважды щелкнуть файл jar.

В зависимости от того, насколько квалифицированы ваши пользователи, возможно, для них командной строки. Если нет, вы можете создать script для каждого класса runnable или одного script, который принимает аргументы для выбора правильного класса.