Несколько запускаемых классов внутри JAR, как их запустить? - PullRequest
50 голосов
/ 20 октября 2010

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

java -jar myjar.jar MyClass

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

Ответы [ 7 ]

66 голосов
/ 20 октября 2010

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

java -cp myjar.jar MyClass

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

13 голосов
/ 20 октября 2010

вам придется использовать:

java -cp myjar.jar MyClass

и

java -cp myjar.jar OtherMainClass
4 голосов
/ 20 октября 2010

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

java -cp myjar.jar MyClass

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

2 голосов
/ 23 октября 2014

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

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

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

/**
 * 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);


        }
    }
}

С точки зрения Windows достаточно создать что-то вроде ссылки

javaw.exe -jar "jarfile" "a"

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

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

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

2 голосов
/ 02 октября 2014

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

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

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 создаст jar для целевого основного метода, который является автономным и не нуждается в других сборках в пути к классам.Это делается путем копирования содержимого каждого jar зависимости в результирующий jar.

1 голос
/ 20 октября 2010

Этот документ поможет вам.

1 голос
/ 20 октября 2010

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

Другие запущенные классы можно запускать с

java -cp myjar.jar OtherClass

но это не будет поддерживать пользователей, дважды щелкающих по файлу jar.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...