Включение зависимостей от jibernate jar в сборку муравьев - PullRequest
2 голосов
/ 22 апреля 2010

Я пытаюсь скомпилировать исполняемый jar-файл для проекта, который использует hibernate. Я пытаюсь создать файл ant build.xml, чтобы упростить процесс сборки, но у меня проблемы с включением hibernate3.jar в конечный jar-файл.

Если я запускаю ant-скрипт, мне удается включить все мои библиотечные jar-файлы, и они помещаются в конечный корень jar-файла. Когда я запускаю jar-файл, я получаю

java.lang.NoClassDefFoundError: org/hibernate/Session 

ошибка. Если я использую встроенный экспорт в jar в Eclipse, он будет работать, только если я выберу «извлечь необходимые библиотеки в jar». Но это раздувает банку и включает в себя слишком большую часть моего проекта (то есть модульных тестов).

Ниже мой сгенерированный манифест:

Manifest-Version: 1.0
Main-Class: main.ServerImpl
Class-Path: ./ antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar
hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.11.jar 
slf4j-simple-1.5.11.jar mysql-connector-java-5.1.12-bin.jar rmiio-2.0.2.jar 
commons-logging-1.1.1.jar

И часть build.xml выглядит так:

<target name="dist" depends="compile" description="Generates the Distribution Jar(s)">
    <mkdir dir="${dist.dir}" />
    <jar destfile="${dist.dir}/${dist.file.name}.jar" basedir="${build.prod.dir}" filesetmanifest="mergewithoutmain">
        <manifest>
            <attribute name="Main-Class" value="${main.class}" />
            <attribute name="Class-Path" value="./ ${manifest.classpath} " />
            <attribute name="Implementation-Title" value="${app.name}" />
            <attribute name="Implementation-Version" value="${app.version}" />
            <attribute name="Implementation-Vendor" value="${app.vendor}" />
        </manifest>
        <zipfileset refid="hibernatefiles" />
        <zipfileset refid="slf4jfiles" />
        <zipfileset refid="mysqlfiles" />
        <zipfileset refid="commonsloggingfiles" />
        <zipfileset refid="rmiiofiles" />
    </jar>
</target>

Рефиды 'для наборов zipfilesets указывают на каталоги в каталоге библиотеки lib в корне проекта. Переменная manifest.classpath принимает путь к классу всех этих библиотечных jar-файлов и выравнивает их с помощью pathconvert и mapper.

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

1 Ответ

2 голосов
/ 22 апреля 2010

Поскольку вы не можете указать jar-inside-jar в вашем classpath, этот способ не будет работать. Вам нужно либо набрать только ваш код, а затем сжать ваш jar с помощью libs jars и скрипта запуска, например

#!/bin/sh
java -cp ./hibernate.jar:./mycode.jar... my.Main

(это то, что делает большинство людей), или вы можете распаковать все ваши библиотеки jar в один и тот же dir, который содержит ваши скомпилированные классы, а затем jar result dir обратно в один файл jar (это то, что maven jar- упаковка с зависимостями делать).

...