デスクトップアプリとして実行したいかなり大きなJavaアプリケーションを構築しました。動作するために必要な他のいくつかのディレクトリがあり、画像フォルダー、サードパーティ API、データベース jar などのクラスを含む bin フォルダーがあります。jar を作成する build.xml がありますが、 jar は実行されません。いずれかの API が見つからないというエラーのようです。
エラーは次のとおりです。
Exception in thread "main" java.lang.NoClassDefFoundError: bibliothek/gui/dock/c
ommon/CContentArea
at pos.main.POSsystem.<init>(Unknown Source)
at pos.main.POSsystem.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: bibliothek.gui.dock.common.CContent
Area
at java.net.URLClassLoader$1.run(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)
... 2 more
build.xml ファイルに興味がある場合は、次のファイルを参照してください。
<?xml version="1.0"?>
<project name="POSsystem" default="main" basedir=".">
<!-- Sets variables which can later be used. -->
<!-- The value of a property is accessed via ${} -->
<property name="src.dir" location="src" />
<property name="build.dir" location="bin" /> <!--the default bin eclipse folder-->
<property name="shipping.dir" location="shipping" />
<property name="doc.dir" location="doc" />
<property name="main-class" value="pos.main.POSsystem" />
<property name="splash-screen" value="images/splash.png" />
<property name = "jars.dir" value="libs" />
<property environment="env"/>
<property name="ECLIPSE_HOME" value="C:\eclipse"/>
<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.7"/>
<property name="source" value="1.7"/>
<path id= "jars.path">
<fileset dir="${jars.dir}" includes="**/*.jar" />
</path>
<path id="pos.classpath">
<pathelement location="bin"/>
<pathelement location="${jars.dir}/docking-frames-common.jar"/>
<pathelement location="${jars.dir}/docking-frames-core.jar"/>
<pathelement location="${jars.dir}/hsqldb.jar"/>
</path>
<!--THIS IS THE ADDED CODE FOR THE CLASSPATH-->
<pathconvert property="manifest.classpath" pathsep=" ">
<path refid="pos.classpath"/>
<mapper>
<chainedmapper>
<flattenmapper/>
<globmapper from="*.jar" to="libs/*.jar"/>
</chainedmapper>
</mapper>
</pathconvert>
<!-- Deletes the existing build, doc and shipping directory-->
<target name="clean">
<echo>"Cleaning..."</echo>
<delete dir="${build.dir}" />
<delete dir="${shipping.dir}" />
<delete dir="${doc.dir}" />
<echo>"Done Cleaning..."</echo>
</target>
<!-- Creates the build, doc and shipping directory-->
<target name="makedir" depends="clean">
<echo>"Making Directories..."</echo>
<mkdir dir="${build.dir}" />
<mkdir dir="${doc.dir}" />
<mkdir dir="${shipping.dir}" />
</target>
<!-- Compiles the java code -->
<target name="compile" depends="makedir"> <!--depends="doc"> CHANGE BACK WHEN YOU RE-IMPLEMENT DOC-->
<echo>"Compiling..."</echo>
<javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime = "false" classpathref="jars.path" />
</target>
<!--Creates the deployable jar file -->
<target name="jar" depends="compile">
<echo>"Making Jar..."</echo>
<jar destfile="${shipping.dir}\POSsystem.jar" basedir="${build.dir}">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="${main-class}" />
<attribute name="Class-Path" value="${manifest.classpath}" />
<attribute name = "SplashScreen-Image" value="${splash-screen}" />
</manifest>
</jar>
</target>
<target name="main" depends="jar"><!--depends="run"> CHANGE BACK WHEN YOU RE-IMPLEMENT RUN-->
<description>Main target</description>
<echo>Main...</echo>
<!--run it here for now instead of from the jar-->
<java classname="pos.main.POSsystem" failonerror="true" fork="yes">
<jvmarg line="-splash:images/splash.png"/>
<classpath refid="pos.classpath"/>
</java>
</target>
</project>
build.xml を ant ビルドとして実行すると、すべてがコンパイルされ、ビルドを介してアプリケーションも実行されますが、jar は実行されません。
役立つ情報が不足している場合は、お知らせください。Java を使用したデスクトップ アプリケーションの作成に関するチュートリアルをたくさん読みましたが、これを正しく理解できないようです。
更新/編集 Jayan による以下のコメントを介して、私の問題には実際に正しいクラスパスが含まれていないことがわかります。そのため、build.xml ファイルを更新してパス変換プロパティを含め、jar ターゲットに属性 class-path を追加しました。ただし、上記とまったく同じエラーが引き続き発生します。