2012-01-15 3 views
1

Есть ли способ сказать jvm для поиска класса с записью main метод автоматически, а не указывать его при вызове java ClassWithMainMethod?java: автоматически найти класс с основным методом

Другими словами, у меня есть каталог со многими скомпилированными классами, один из которых имеет метод main, и я хочу указать только этот каталог.

+0

Где бы виртуальная машина ищет такого класса? – Mat

+5

Что делать, если несколько классов в каталоге имеют «основные» методы? –

+1

Java не делает этого из коробки, потому что это не очень распространено в том, что основной класс Java-программы находится в каталоге, в котором вы должны запускать Java-процесс, в котором есть классы в пакете по умолчанию, считается плохим практика. На самом деле, даже для java-программы просто нет файлов '.class' в каталоге - вы обычно распространяете кучу файлов .jar с вашим приложением и требуемыми библиотеками и выполняете одно из них или предоставляете программу запуска чтобы иметь больше контроля над запуском. – millimoose

ответ

4

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

java -jar MyJar.jar 

хотя.

См http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

Вы также можете отправить свое приложение с помощью скрипта, который выполняет соответствующую команду для вас:

#startup.cmd 
java -cp ... com.foo.bar.Main 
0

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

0

Если существует более одного класса с основным методом?

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

5

Если в вашем сценарии:

  • это нормально, чтобы выполнить первый файл классов в каталоге;
  • классы в этом каталоге находятся в пакете по умолчанию;
  • команда javap доступна - т. Е. У вас установлен JDK, а не только JRE;

вы можете использовать следующий Баш скрипт:

#!/usr/bin/env sh 
for classfile in *.class; do 
    classname=$(echo $classfile | cut -f 1 -d '.') 
    echo $classname 
    if javap -public $classname | fgrep 'public static void main(java.lang.String[])'; then 
     java $classname "[email protected]" 
    fi 
done 
+1

Это реальный путь, но обратите внимание, что функция 'main' также может быть украшена ключевым словом' final', которое будет пропущен ваш grep-вызов. Кроме того, в зависимости от того, написал ли автор 'main (String ... args)' или 'main (String [] args)', подпись будет отличаться. Вы должны полагаться на линию чуть ниже, чтобы преодолеть эту проблему. Вы можете видеть, как мы справлялись с этим в нашем проекте [sandes sandbox] (https://github.com/prologin/camisole/blob/master/camisole/languages/java.py). – zopieux