当前位置: 首页 > 知识库问答 >
问题:

为什么把所有的罐子组合在一起?

顾承平
2023-03-14

我已经创建了基于JAX-RS和使用Jersey嵌入式web服务器的RESTful web服务。我的ant脚本成功地编译了代码,但当我运行主类时,它给出了错误ClassNotFoundException。所以经过研究,我想出了一个解决方案&这里是使用外部jar文件构建java ant文件。我所做的是创建一个捆绑的jar文件,尝试执行它&它工作得非常好。我想知道背后的原因:

  • 为什么这个解决方案有效?
  • 为什么要合并所有jar文件?

它是否类似于我们按照J2EE体系结构创建的war文件,否则服务器(比如TOMCAT)&在我的例子中,用于Jersey embedded HTTP服务器的jar文件将不会提取war文件?

编辑:这是我的antbuild.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专家,所以请原谅我,如果这个问题是愚蠢的。

共有1个答案

沈宇定
2023-03-14

为什么这个解决方案有效?

在您的特定情况下,您可能没有在前面的部署中包含所有必要的依赖项。(从您的问题中不清楚您最初是如何进行部署的。)

现在,您已经将所有应用程序和依赖类文件等放入一个JAR文件中,并且可能正在部署/运行该文件。它能工作是因为现在它拥有了运行所需的一切...这是以前没有的。

就你的情况而言,我怀疑这并不是绝对必要的。可能有一种方法可以“部署”所有依赖项,而不必将它们组合到单个JAR文件中。

不过,有一种情况是“优步罐”有优势。这是指JAR是一个“可执行的”JAR,并且您希望能够将其作为单个文件分发/安装。(可执行JAR文件可以引用外部JAR,等等,但是您必须这样做的方式是“脆弱的”。)

和war文件类似吗...?

 类似资料:
  • Oracle Java社区网站上的一篇文章给出了以下方法作为示例(对于JPA转换器,但我想这与此无关): 将字符串y转换为字符串val有什么用?这样做有正当理由吗? 原创文章:JPA中的新功能

  • 我已经使用$.mobile.changepage在我的phonegap jquerymobile项目中进行重定向。然而,让我困惑的是,我需要将所有页面的脚本放在同一个文件中index.html.否则,重定向页面无法执行其标头中的功能。 例如,我的index.html似乎是 然后,我的设备将重定向到测试。html,似乎是 然而,脚本永远不会在test.html.执行然后我把脚本index.html,

  • 我在阅读Maven文档时遇到了这个名称。 是什么意思?它的特性/优点是什么?

  • 问题内容: 我已经阅读了很多关于此的文章/说明,并且花费了太多时间,但是所有内容要么太广泛,要么太具体。 这个问题实际上仅适用于我制作的Applet。它包含一个类,并需要其他2个Jar库。我已经将它们包括在项目中(多个项目,因为我已经在Netbeans和Eclipse中进行了尝试……很容易重新创建一个Class项目)。所有这些的关键是我的HTML / web项目不必处理多个Jar或引用它们。这也不

  • 我读了这么多关于这方面的文章/解释,花了太多时间,但所有的东西要么太宽泛,要么太具体。 这个问题实际上只适用于我制作的一个Applet。它包含一个类,需要另外两个Jar库。我已经在项目中包含了这些内容(多个项目,因为我已经在Netbeans和Eclipse中尝试过了...很容易重新创建一个类项目)。所有这一切的要点是,我的HTML/Web项目不应该必须处理多个Jar或引用它们。它也完全不是一个复杂

  • 我正在尝试导出可运行的文件,但每次我这么做时,它都会说,“VM参数将不是可运行jar的一部分。在启动jar时,可以在命令行上传递参数。” 有人知道怎么修吗?