Создайте файл jar, который может быть запущен на любой машине

У меня есть простое приложение на Java, которое печатает "hello world!" на консоли. Он запакован в app.jar. Структура банки:

main / Hello.class - мой основной класс с единственным методом println

МЕТА-ИНФ / МАНИФЕСТ.MF

Файл манифеста содержит:

Manifest-Version: 1.0
Main-Class: main.Hello

Все идет нормально.

Но когда появляется зависимость, начинаются неприятности. Я не уверен, но думаю, что в этом случае вам нужно поместить все библиотеки в файл jar. Если я помещаю их в META-INF / lib, я должен указать "Class-Path" в манифесте. Как будет выглядеть "Class-Path"?

P.S Есть несколько похожих вопросов, но я не нашел подходящего ответа.


person Jeriho    schedule 27.07.2010    source источник


Ответы (2)


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

Файл build.xml выглядит примерно так:

<project default="create_run_jar" name="Create Runnable Jar for MyProject">
    <!--ANT 1.7 is required -->
    <target name="create_run_jar">
        <jar destfile="my-runnable-jar.jar">
            <manifest>
                <attribute name="Main-Class" value="my.MainClass"/>
                <attribute name="Class-Path" value="."/>
            </manifest>
            <fileset dir="E:/path/to/my/project/bin"/>
            <fileset dir="E:/path/to/my/project/classes"/>
            <zipfileset src="E:/path/to/library/some-library.jar"/>
        </jar>
    </target>
</project>

Обратите внимание, что если вы используете Eclipse, вы можете просто сделать File / Export ... / Runnable jar file, и он сделает все за вас (включая создание ANT build.xml).

person mikera    schedule 27.07.2010

Вам не нужно указывать ничего особенного, если вы распаковываете библиотеки и интегрируете их в свой проект. Если вы это сделаете, у вас должна быть «основная» папка, а если у вас org.apache.foo в качестве внешней библиотеки, у вас также будет папка «org» на верхнем уровне.

person Borealid    schedule 27.07.2010
comment
Это очень грубо, но работает. Я хочу включить библиотечные банки в результирующую банку в папку META-INF / lib, поэтому вопрос все еще открыт. - person Jeriho; 27.07.2010
comment
мне не кажется хорошей практикой. Я думаю, что OP прав в том, что лучше помещать банки в вашу банку и добавлять их в путь к классам. - person Sanjay Manohar; 27.07.2010