【发布时间】:2016-03-05 10:36:41
【问题描述】:
我已经创建了基于 JAX-RS 的 RESTful Web 服务并使用了 Jersey 嵌入式 Web 服务器。当我运行 main class 时,我的 ant 脚本成功编译代码,但它给了我错误 ClassNotFoundException。因此,在进行研究之后,我想出了解决方案,这里是 java build ant file with external jar files 。我所做的是创建了一个捆绑的 jar 文件尝试执行它并且它工作得很好。我想知道背后的原因:
- 为什么这个解决方案有效?
- 为什么要合并所有 jar 文件?
它是否类似于我们按照 J2EE 架构创建的 war 文件,否则服务器(比如 TOMCAT)不会提取 war 并且在我的情况下是 Jersey 嵌入式 HTTP 服务器的 jar 文件?
编辑:
这是我的蚂蚁build.xml 文件
<property name="lib.dir" value="${user.dir}/lib"/>
<property name="build.dir" value="${user.dir}/build"/>
<property name="build.lib.dir" value="${build.dir}/lib"/>
<property name="build.classes.dir" value="${build.dir}/classes"/>
<property name="src.dir" value="${user.dir}/src/main/java"/>
<property name="main.class" value="com.assignment.ConsoleServer"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="init" depends="clean">
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes.dir}"/>
</target>
<target name="copy_jars" depends="init" >
<copy todir="${build.lib.dir}" >
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
</fileset>
</copy>
</target>
<target name="compile" depends="copy_jars">
<javac srcdir="${src.dir}" destdir="${build.classes.dir}" classpathref="classpath" includeantruntime="false"/>
</target>
<target name="jar" depends="compile">
<jar destfile="${build.dir}/${ant.project.name}.jar" basedir="${build.classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
<zipgroupfileset dir="${lib.dir}" includes="*.jar"/>
</jar>
</target>
<target name="run" depends="jar">
<java fork="true" classname="${main.class}">
<classpath>
<path refid="classpath"/>
<path location="${build.dir}/${ant.project.name}.jar"/>
</classpath>
</java>
</target>
这是我的文件夹结构
附:我不是java专家,如果这个问题很愚蠢,请原谅我。
【问题讨论】: