какова правильная внутренняя структура файла JAR - PullRequest
5 голосов
/ 02 апреля 2012

Это действительно глупый вопрос, на который я не могу найти точный ответ.

Фон.

Я использую Eclipse (с одним из плагинов ANT на терминале XP).

Я только что начал играть с ANT, в директиве [jar] я устанавливаю местоположение моего готового файла JAR, и я получаю следующее при разархивировании файла

META-INF / MANIFEST.MF MyMainFile.class

, что соответствует тому, что было найдено на веб-сайте оракула для внутренней структуры. (здесь http://docs.oracle.com/javase/tutorial/deployment/jar/view.html)

Но когда я пытаюсь запустить свой файл, я получаю ошибку 'main class not found'?

Я видел несколько других постов, где люди «разархивировали» файл JAR и получили следующую структуру:

META-INF / MANIFEST.MF dtvcontrol / DTVControlApp.class

(отсюда http://www.coderanch.com/t/528312/java/java/standalone-application)

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

META-INF / MANIFEST.MF MyPackage / MyMainFile.class

и если да, то почему я получаю неправильную структуру, используя ANT, или почему существуют 2 разные «правильные» внутренние структуры? (как указать main-class и classpath для каждого / control, что я получаю)

Также, если вам интересно, в состояниях файла MANIFEST (сборка с использованием ANT) [attribute name = "Main-Class" value = "MyPackage.MyMainFile" /]

Также структура каталогов разрабатываемого пакета выглядит следующим образом ...

/ JavaDev / MyTestPackage / src (содержит исходные файлы) // JavaDev / MyTestPackage / bin (содержит файлы классов из eclipse или из задачи ANT JAVAC, правильно ли я назвал его? Должен ли я назвать его сборкой?)

Кроме того, когда я создаю флягу, я не называю ее «MyTestPackage.jar», а просто «test.jar», может ли это быть причиной проблемы? Я полагаю, не так, как если бы я хорошо понял, в этом суть определения [основного класса].

Вдобавок ко всему этому ...

MyTestPackage - это небольшая библиотека визуальных сообщений об ошибках, которую я использую в другом месте, и у меня есть второй файл, в котором есть основной класс для тестирования. Как таковой он указывает на различные библиотеки (нужно ли копировать все библиотеки SWT в указанный каталог?)

Я где-то читал, что если я загружаю библиотеки в свой основной класс (что я, очевидно, делаю, чтобы открыть окно), то попытка запустить программу завершится неудачно с «основным классом, не найденным», если я их использую, то же самое также Значение true для добавления любых членов «static final» (которые я использую для регистрации ошибок).

Задача «Статический финал» ... Я попытался настроить путь к классам в ANT, и я получаю множество других ошибок для соединения с Log4J и моей «оберткой», которую я использую (чтобы сделать это плохим импортом), но библиотеки существуют там, где они должны как установлено в пути к классам).

Я чувствую, что почти у цели ... но не совсем ...

Я делаю это для небольших «библиотечных проектов», которые я создаю с намерением использовать MAVAN для основного внешнего пакета, который свяжет их все вместе ... сейчас, однако, я просто хочу, чтобы все было так как это работает.

Я могу предоставить полный источник или любую другую информацию по мере необходимости.

Заранее спасибо ...

David

1 Ответ

8 голосов
/ 02 апреля 2012

Это просто, когда знаешь, где искать.Скажем, ваш META-INF / MANIFEST.MF содержит строку:

Main-Class: mypackage.MyMainFile

, тогда структура фляги должна быть

META-INF/MANIFEST.MF
mypackage/MyMainFile.class

, где MyMainFile должен находиться в правильном пакете:

package mypackage;
public class MyMainFile {
  public static void main(String[] args) {
...

Ваше сообщение об ошибке вызвано тем, что MyMainFile находится не в том месте.

Редактировать: Прошло много времени с тех пор, как я в последний раз делал это с муравьем,но я думаю, что вам нужно что-то вроде этого: структура исходного файла, которая отражает структуру пакета, скажем

src/main/java/mypackage/MyMainFile.java

, и каталог для помещения файла скомпилированного класса, скажем,

target

(Я использую здесь соглашения maven, муравью это не важно, и вы можете использовать (rightclick) -> properties-> Java Build path-> Sources tab в eclipse, чтобы установить исходный каталог src / main / java и цельк цели / классам).Затем в ant есть цель компиляции, которая компилируется из источника в цель:

<target name="compile">
    <mkdir dir="target/classes"/>
    <javac srcdir="src/main/java" destdir="target/classes"/>
</target> 

, чтобы после ant compile вы увидели файл класса в цели

target/classes/mypackage/MyMainFile.class

Затемзадача ant jar, которая упаковывает это:

<target name="jar" depends="compile">
    <jar destfile="target/MyJarFile.jar" basedir="target/classes">
        <manifest>
            <attribute name="Main-Class" value="mypackage.MyMainFile"/>
        </manifest>
    </jar>
</target>

После произнесения ant compile jar у вас должен быть файл MyJarFile.jar внутри цели, а

java -jar MyJarFile.jar

должен запускать метод main.

...