Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java tools & IDE's > Ant: Исполняемый jar файл с внешними библиотеками


Автор: Anyone 13.12.2010, 00:19
В проекте используются внешние библиотеки, а также dll-ки.
С помощью Ant создаю исполняемый jar-файл, который требует наличие папки с библиотеками, все хорошо работает.
Но нужно включить библиотеки в исполняемый jar-файл.

Мой build.xml:
Код

<?xml version="1.0" encoding="UTF-8"?>
<project name="Sms2AllDownloader" default="build" basedir=".">
    <property name="name" value="Sms2AllDownloader"/>
    <property name="src.dir" location="${basedir}/src"/>
    <property name="lib.dir" location="${basedir}/lib"/>
    <property name="build" location="${basedir}/build"/>
    <property name="build.classes" location="${build}/classes"/>
    <property name="manifest.main.class" value="Sms2All.MainForm"/>
    <path id="build.classpath">
        <fileset dir="${lib.dir}" includes="**/*.jar"/>
    </path>
    
    <!-- convert classpath to a flat list/string for use in manifest task -->
    <pathconvert property="mf.classpath" pathsep=" ">
        <path refid="build.classpath" />
        <flattenmapper />
    </pathconvert>
    
    <manifest file="MANIFEST.MF">
        <!-- <attribute name="Built-By" value="${manifest.built.by}"/> -->
        <!-- <attribute name="Created-By" value="${manifest.created.by}"/> -->
        <attribute name="Main-Class" value="${manifest.main.class}"/>
        <!-- <attribute name="Implementation-Version" value="${version.number}-b${build.number}"/> -->
        <!-- <attribute name="Built-Date" value="${TODAY}"/> -->
        <attribute name="Class-Path" value="${mf.classpath}" />
    </manifest>
    
    <!--
    <manifestclasspath property="lib.list" jarfile="${build}/${name}.jar">
        <classpath refid="libs.dir"/>
    </manifestclasspath>
    -->
    
    <!-- Сборка приложения -->
    <target name="build" depends="clean" description="Builds the application">
        <!-- Создание директорий -->
        <mkdir dir="${build.classes}"/>
 
        <!-- Компиляция исходных файлов -->
        <javac srcdir="${src.dir}"
               destdir="${build.classes}"
               debug="false"
               deprecation="true"
               optimize="true" >
            <classpath refid="build.classpath"/>
        </javac>
 
        <!-- Копирование необходимых файлов -->
        <copy todir="${build.classes}">
            <fileset dir="${src.dir}" includes="**/*.*" excludes="**/*.java"/>
        </copy>
        <copy todir="${build}">
            <fileset dir="${basedir}" includes="*.dll"/>
        </copy>
 
        <!-- Создание JAR-файла -->
        <jar jarfile="${build}/${name}.jar" manifest="MANIFEST.MF">
            <fileset dir="${build.classes}"/>
            <fileset dir="${lib.dir}" includes="**.jar"/>
        </jar>
    </target>
 
    <!-- Очистка -->
    <target name="clean" description="Removes all temporary files">
        <!-- Удаление файлов -->
        <delete dir="${build.classes}"/>
    </target>
</project>

 

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

Цитата

Exception in thread "main" java.lang.NoClassDefFoundError: com/melloware/jintell
itype/HotkeyListener
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(Unknown Source)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.melloware.jintellitype.HotkeyLi
stener
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 12 more
Could not find the main class: Sms2All.MainForm. Program will exit.


Распаковал jar-файл - все библиотеки есть, в манифесте они прописаны в разделе class-path.
Содержимое манифеста:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.1
Created-By: 1.6.0_21-b07 (Sun Microsystems Inc.)
Main-Class: Sms2All.MainForm
Class-Path: commons-logging-1.1.1.jar jdic.jar jdic_native_applet.jar 
 jdic_stub_unix.jar jdic_stub_windows.jar jintellitype-1.3.1.jar jdic_
 native.jar jdic_native.jar jdic_native.jar jdic_native.jar

В чем может быть проблема?

Спасибо за внимание.

Автор: powerOn 13.12.2010, 01:20
Цитата(Anyone @  13.12.2010,  00:19 Найти цитируемый пост)
Распаковал jar-файл - все библиотеки есть, в манифесте они прописаны в разделе class-path.


Библиотеки в jar файл не упаковывают, они должны лежать вне и подключаться при запуске к classpath.

Автор: Anyone 13.12.2010, 09:15
Цитата(powerOn @  13.12.2010,  01:20 Найти цитируемый пост)

Библиотеки в jar файл не упаковывают, они должны лежать вне и подключаться при запуске к classpath.

Но я читал статьи где описано как это сделать, именно так и сделал, или я что-то не правильно понял?  smile 

Автор: Anyone 13.12.2010, 10:20
Цитата(powerOn @  13.12.2010,  01:20 Найти цитируемый пост)
Библиотеки в jar файл не упаковывают, они должны лежать вне и подключаться при запуске к classpath.

Так работает, спасибо.
Можно ли все запаковать в один jar-файл?

Автор: Anyone 13.12.2010, 11:53
Подскажите, пожалуйста, как нужно определить pathconvert, чтобы строка включала путь к библиотекам, то есть вместо этого:

 commons-logging-1.1.1.jar jdic.jar jdic_native_applet.jar 
 jdic_stub_unix.jar jdic_stub_windows.jar jintellitype-1.3.1.jar jdic_
 native.jar jdic_native.jar jdic_native.jar jdic_native.jar

получить:

lib/commons-logging-1.1.1.jar lib/jdic.jar lib/jdic_native_applet.jar  и тд.

Спасибо.

Автор: Anyone 13.12.2010, 12:19
Нашел способ:
Код

    <pathconvert property="mf.classpath" pathsep=" ">
        <path refid="build.classpath" />
        <!-- <mapper type="flatten" />  -->
    <chainedmapper>
        <flattenmapper/>
        <globmapper from="*" to="lib/*"/>
    </chainedmapper>

Автор: Anyone 13.12.2010, 13:47
Остался один нерешенный вопрос.
В проекте используются ресурсы (картинки), я запаковываю их в jar - файл.
Как к ним доступиться, или нужно поступить как и с библиотеками - скопировать в текущий каталог?

Автор: Anyone 13.12.2010, 16:51
Цитата(Anyone @  13.12.2010,  13:47 Найти цитируемый пост)
В проекте используются ресурсы (картинки), я запаковываю их в jar - файл.
Как к ним доступиться

Решил задачу такими 2мя способами:
Код

imageRun=ImageIO.read(this.getClass().getClassLoader().getResourceAsStream("Sms2All/Resources/run_exc_original.gif"));

imageProgress=ImageIO.read(this.getClass().getClassLoader().getResource("Sms2All/Resources/progress.gif"));
            
trayIcon = new TrayIcon(imageRun, "Sms2AllDwnloader");



Но почему-то иконка в трее не анимированная, а если прописать полный путь к незапакованной картинке - все нормально.

Как можно решить проблему?

Автор: Anyone 13.12.2010, 17:45
Всем спасибо, вот решение:
Код

            imageRun=Toolkit.getDefaultToolkit().getImage(
                this.getClass().getClassLoader().getResource("Sms2All/Resources/run_exc_original.gif"));
            imageProgress=Toolkit.getDefaultToolkit().getImage(
                this.getClass().getClassLoader().getResource("Sms2All/Resources/progress.gif"));


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)