gpt4 book ai didi

java - 为什么要将所有 jar 组合在一起?

转载 作者:行者123 更新时间:2023-11-28 23:28:23 25 4
gpt4 key购买 nike

我创建了基于 JAX-RS 的 RESTful 网络服务,并使用了 Jersey 嵌入式网络服务器。我的 ant 脚本编译代码成功,但在我运行 main class 时出现错误 ClassNotFoundException。所以在做了研究之后我想出了解决方案&这里是java build ant file with external jar files .我所做的是创建一个捆绑的 jar 文件,尝试执行它并且它工作得很好。我想知道背后的原因:

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

它是否类似于我们按照 J2EE 架构创建的 war 文件,否则 war 将不会被服务器(比如 TOMCAT)提取,在我的例子中是 Jersey 嵌入式 HTTP 服务器的 jar 文件?

编辑:这是我的 ant 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>

这是我的文件夹结构

enter image description here

附言我不是 Java 专家,所以如果这个问题很愚蠢,请原谅我。

最佳答案

Why this solution works?

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

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

Why I should combine all jar file?

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

但是,在一种情况下,“uber-jar”具有优势。那就是当 JAR 旨在成为“可执行”JAR,并且您希望能够将其作为单个文件分发/安装时。 (和可执行 JAR文件 可以 引用外部 JAR 等,但是您必须这样做它是“脆弱的”。)

Is it similar to war file ... ?

某种程度上,虽然 WAR 文件包含 JAR 文件……通常还包含 Web 容器可以理解的其他类型的资源。

关于java - 为什么要将所有 jar 组合在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34021528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com