当前位置: 首页 > 面试题库 >

使用Ant在新的jar文件构建中包括外部jar文件

澹台景山
2023-03-14
问题内容

我刚刚“继承”了一个Java项目,而不是来自Java背景,有时我会有点迷失。Eclipse用于在开发过程中调试和运行应用程序。我已经通过Eclipse成功创建了一个.jar文件,该文件“包含”了所有必需的外部jar,例如Log4J,xmlrpc-
server等。然后可以使用以下命令成功运行此大.jar:

java -jar myjar.jar

我的下一步是使用Ant(版本1.7.1)自动进行构建,因此我不必参与Eclipse即可进行构建和部署。由于我缺乏Java知识,这被证明是一个挑战。项目的根目录如下所示:

|-> jars (where external jars have been placed)
|-> java
| |-> bin (where the finished .class / .jars are placed)
| |-> src (Where code lives)
| |-> ++files like build.xml etc
|-> sql (you guessed it; sql! )

我的build.xml包含以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="build" name="Seraph">
    <property environment="env"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.6"/>
    <property name="source" value="1.6"/>

    <property name="build.dir"     value="bin"/>
    <property name="src.dir"       value="src"/>
    <property name="lib.dir"       value="../jars"/>
    <property name="classes.dir"   value="${build.dir}/classes"/>
    <property name="jar.dir"       value="${build.dir}/jar"/>
    <property name="jar.file"      value="${jar.dir}/seraph.jar"/>
    <property name="manifest.file" value="${jar.dir}/MANIFEST.MF"/>

    <property name="main.class" value="no.easyconnect.seraph.core.SeraphCore"/>

    <path id="external.jars">
        <fileset dir="${lib.dir}" includes="**/*.jar"/>
    </path>

    <path id="project.classpath">
        <pathelement location="${src.dir}"/>
        <path refid="external.jars" />
    </path>

    <target name="init">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${classes.dir}"/>
        <mkdir dir="${jar.dir}"/>
        <copy includeemptydirs="false" todir="${build.dir}">
            <fileset dir="${src.dir}">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>

    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="cleanall" depends="clean"/>

    <target name="build" depends="init">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="bin" source="${source}" target="${target}" classpathref="project.classpath">
            <src path="${src.dir}"/>
        </javac>
    </target>

    <target name="build-jar" depends="build">
        <delete file="${jar.file}" />
        <delete file="${manifest.file}" />

        <manifest file="${manifest.file}" >
            <attribute name="built-by" value="${user.name}" />
            <attribute name="Main-Class" value="${main.class}" />
        </manifest>

        <jar destfile="${jar.file}" 
            basedir="${build.dir}" 
            manifest="${manifest.file}">
            <fileset dir="${classes.dir}" includes="**/*.class" />
            <fileset dir="${lib.dir}" includes="**/*.jar" />
        </jar>
    </target>
</project>

然后运行:ant clean build-jar

名为seraph.jar的文件放置在java / bin / jar-目录中。然后,我尝试使用以下命令运行此jar:java -jar bin / jar
/ seraph.jar

结果是在控制台上的以下输出:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
    at no.easyconnect.seraph.core.SeraphCore.<clinit>(SeraphCore.java:23)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    ... 1 more
Could not find the main class: no.easyconnect.seraph.core.SeraphCore. Program will exit.

我怀疑我在build.xml文件中做了一些令人惊讶的愚蠢的事情,并且花了两天的大部分时间来尝试对配置进行更改,但无济于事。非常感谢您对此工作的任何帮助。

哦,对不起,我遗漏了一些重要信息。这是我第一次在这里发帖。


问题答案:

有了在这里回答的人的有用建议,我开始研究One-
Jar。经过一些死胡同(和一些与我以前的结果完全一样的结果,我设法使它起作用。对于其他人参考,我列出了对我有用的build.xml。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="build" name="<INSERT_PROJECT_NAME_HERE>">
    <property environment="env"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.6"/>
    <property name="source" value="1.6"/>

    <property name="one-jar.dist.dir" value="../onejar"/>
    <import file="${one-jar.dist.dir}/one-jar-ant-task.xml" optional="true" />

    <property name="src.dir"          value="src"/>
    <property name="bin.dir"          value="bin"/>
    <property name="build.dir"        value="build"/>
    <property name="classes.dir"      value="${build.dir}/classes"/>
    <property name="jar.target.dir"   value="${build.dir}/jars"/>
    <property name="external.lib.dir" value="../jars"/>
    <property name="final.jar"        value="${bin.dir}/<INSERT_NAME_OF_FINAL_JAR_HERE>"/>

    <property name="main.class"       value="<INSERT_MAIN_CLASS_HERE>"/>

    <path id="project.classpath">
        <fileset dir="${external.lib.dir}">
            <include name="*.jar"/>
        </fileset>
    </path>

    <target name="init">
        <mkdir dir="${bin.dir}"/>
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${classes.dir}"/>
        <mkdir dir="${jar.target.dir}"/>
        <copy includeemptydirs="false" todir="${classes.dir}">
            <fileset dir="${src.dir}">
                <exclude name="**/*.launch"/>
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>

    <target name="clean">
        <delete dir="${build.dir}"/>
        <delete dir="${bin.dir}"/>
    </target>

    <target name="cleanall" depends="clean"/>

    <target name="build" depends="init">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="${classes.dir}" source="${source}" target="${target}">
            <src path="${src.dir}"/>
            <classpath refid="project.classpath"/>   
        </javac>
    </target>

    <target name="build-jar" depends="build">
        <delete file="${final.jar}" />
        <one-jar destfile="${final.jar}" onejarmainclass="${main.class}">
            <main>
                <fileset dir="${classes.dir}"/>
            </main>
            <lib>
                <fileset dir="${external.lib.dir}" />
            </lib>
        </one-jar>
    </target>
</project>

我希望其他人可以从中受益。



 类似资料:
  • 我创建了一个ant构建文件,将我的java src编译成一个.jar文件。它使用外部jar文件。

  • HTSJDK是一个用于访问常见文件格式(如SAM和VCF)的库。我想构建HTSJDK JAR。在文档页面中说我必须为此使用Ant。所以我安装了Ant并运行以下命令: ant htsjdk-jar [javac]用法:javac [javac]use-help获取可能选项列表 生成失败 build.xml文件有问题。这里是文件的开头: 拜托,有人能告诉我该怎么做才能解决这个问题吗?

  • 我正在尝试创建一个包含以下项目内容的jar文件 项目 user_interface(包文件夹,包括与GUI相关的所有.类) function_operations(包文件夹,包括与操作相关的所有.类) 声音(文件夹包括所有声音文件) 图标(包括所有图像和图标) jar(包括所有外部jar文件) manifest.txt(有一行*main-class:user_interface.messenger

  • 我正在尝试编写一个ant目标,它将基于一堆java文件和一些属性文件创建一个jar,但在按照当前项目设置的方式包含属性文件时遇到了问题。 这些是我的蚂蚁目标: 1-从“myjar.src”文件夹编译java源文件,并将生成的类放入“myjar.classes”文件夹。完成后,复制所有非文件。java文件从“myjar.src”到“myjar.classes”。 2-使用basedir=${myja

  • 问题内容: 我有以下内容: 这是我的目录结构: / build / lib / MagicFolder / Src /build.xml 文件夹包含文件。 路径应为输入参数。 有外部.jar库,应该将其包含在我的版本中。 将编译.class`文件的文件夹 问题:我应该如何改变我的?我应该: 添加外部库 当我运行我的应用程序时,为我的应用程序输入2个输入参数 问题答案: 如果您需要在类路径中添加一个

  • 问题内容: 我想在构建时使用gradle在我的项目中包含salesforce的enterprise.jar文件。有人可以帮助我如何在项目的src / main / resources文件夹中包含一个本地jar文件。 问题答案: 文档中对此进行了说明。应该执行以下操作: 我不会把罐子放进去。它不是项目的资源,而是编译依赖项。我会将其放在lib目录中。