我有一个代码库,我想生成几个可交付的jar文件,每个文件都要从命令行运行,并访问代码库的某些功能.运行时,一些命令行参数是jar中的其他类,然后由反射创建.它工作得很好,但我必须指定类的非常长的完全限定路径,即使这些类在jar文件中.
我使用ant编译然后jar一系列目录.从最小的示例build.xml文件:
<property name="build" location="build"/>
<property name="jars" location="${build}/jars"/>
<property name="classes" location="${build}/classes"/>
<property name="src" location="src/dom/place/proj"/>
<target name="utility">
<javac
includeantruntime="false"
srcdir="${src}/utility" destdir="${classes}"
classpathref="classpath" />
<jar
destfile="${jars}/utility.jar"
basedir="${classes}"
includes="**/utility/**" />
</target>
<target name="tokenizers" depends="utility">
<javac
includeantruntime="false"
srcdir="${src}/tokenizers"
destdir="${classes}"
classpathref="classpath" />
<jar
destfile="${jars}/tokenizers.jar"
basedir="${classes}"
includes="**/tokenizers/**" />
</target>
Run Code Online (Sandbox Code Playgroud)
后来,我正在创建一个包含所有必需类的jar文件,并将运行一个命令,例如:
<target name="tokenize-file-jar">
<jar destfile="${dist}/TokenizeFile.jar">
<zipgroupfileset dir="${jars}">
<include name="utility.jar"/>
<include name="tokenizers.jar"/>
</zipgroupfileset>
<manifest>
<attribute name="Main-Class" value="dom.place.proj.tokenizers.TokenizeFile"/>
</manifest>
</jar>
</target>
Run Code Online (Sandbox Code Playgroud)
这一切都有效,并查看jar文件,所有类都在那里.
prompt > unzip -l TokenizeFile.jar
Archive: TokenizeFile.jar
Length Date Time Name
-------- ---- ---- ----
0 01-11-12 …Run Code Online (Sandbox Code Playgroud)