繁体   English   中英

如何从我的程序创建一个Jar文件

[英]How do I create a Jar file from my program

我正在使用eclipse,我在创建jar文件时遇到了困难。

所以我有像getClass().getResource("/imagesfolder/dog.jpg") 如何创建Jar文件,以便包含我的图像的文件夹也包含在内。 因为如果我的Jar文件不在包含类文件和imagesfolder的bin文件夹中,则会发生错误。

我尝试了File> Export> Java> Executable Jar> Save in desktop但是当我双击它时,它没有启动。 我试过cmd它工作但有错误,它找不到图像文件夹。

如何在双击执行的单独目录中执行jar文件

我有一个类TreeIcon; 它使用两个图像,然后将它们存储在TreeIcon包中的“images”文件夹中。 无论出于何种原因,我制作了TreeIcon spacecheck.images的包(它可以像com.mycompany.images一样容易)。 因此,我使用以下代码来访问我的图像:

expandedIcon = new ImageIcon(TreeIcon.class.getResource("images/Expanded.GIF"));

这里的'images'是仅包含图像的文件夹的名称,而不是包含该图像的文件夹的名称。 IE,在我的程序源树结构中,图像位于名为spacecheck.images.images的文件夹中。

请注意,我的字符串开头没有斜杠; 这意味着它引用了一个相对于类的路径。 将斜杠放在spec的前面会导致getResource将路径视为jar中的绝对路径,因此我也可以使用字符串"/spacecheck/images/images/Expanded.GIF"

ANT就是这样

在eclipse中,您可以使用Ant来构建.jar文件。

来自ant.apache.org

Apache Ant是一个Java库和命令行工具,其任务是将构建文件中描述的进程作为目标和扩展点相互依赖。 Ant的主要已知用法是构建Java应用程序。 Ant提供了许多内置任务,允许编译,组装,测试和运行Java应用程序。 Ant还可以有效地用于构建非Java应用程序,例如C或C ++应用程序。 更一般地,Ant可以用于引导任何类型的过程,其可以根据目标和任务来描述。

Ant是用Java编写的。 Ant的用户可以开发自己的包含Ant任务和类型的“antlibs”,并提供大量现成的商业或开源“antlibs”。

Ant非常灵活,不会将编码约定或目录布局强加给Java项目,后者将其用作构建工具。

寻求结合构建工具和依赖关系管理的解决方案的软件开发项目可以将Ant与Apache Ivy结合使用。

Apache Ant项目是Apache Software Foundation的一部分。

使用谷歌搜索,你会发现很多文档,我将展示它的基本方法。


Build.xml文件

首先创建一个新文件xml,例如“Build.xml”,这将是Ant将读取的文件。

你开始在里面写这个:

<?xml version="1.0" encoding="UTF-8"?>

这是您一直包含的基本路线。

<project name="NameOfYourProject" default="try_jar" basedir=".">

这个(在文件末尾有结束标记</project> ,是主标记,声明项目的名称和将要执行的第一个任务(默认),每个任务都是Ant将要做的事情,并且是称为“目标”,你可以创建一个目标来完成所有事情或各种目标,每个目标做几件事,在这种情况下你可以创建不同的“流程图”,蚂蚁将遵循。例如我通常为Ant创建3条路线: try_jar只是用于尝试所有在jar中工作而不做很多事情,new_version_jar与try_jar相同但会更新版本号,将签署jar和其他一些东西,javadoc为项目创建javadoc Il会告诉你基本的try_jar。

<description>
This buildfile is used to build the jar of the game.
</description>

无需解释。

<!-- ================= File and Directory Names ==================== -->
<property name="src" location="${basedir}/src" />
<property name="conf" location="${basedir}/conf" />
<property name="build" location="${basedir}/build" />
<property name="dist" location="${basedir}/dist" />
<property name="app.name" value="MyAppName" />
<property name="dist.jarHome" value="${user.home}/MyApplicationMainFolder" />
<property name="app.version" value="0.2" />
<tstamp />
<property name="jar.name" value="${app.name}_${app.version}.${DSTAMP}.jar" />
<property name="jar.completePath" value="${dist.jarHome}/${jar.name}" />

这里我们声明jar的基本属性,我们告诉它源代码的位置,构建文件夹应该在哪里等等。 我们还选择将所有应用程序放在基本用户主目录中的一个文件夹中(在mac中为/ user / UserName /)并创建该文件的名称,该文件将包含名称(显然)该版本以及此jar的时间被建造。 这样可以避免重复或覆盖我们可能要保留的文件。

<property name="shared.lib" value="${basedir}/lib" />

在这里,我们必须指定存储此插件运行所需的jar文件的目录

<!-- =============== Custom Ant Task Definitions =================== -->
<property name="compile.debug" value="true" />
<property name="compile.deprecation" value="false" />
<property name="compile.optimize" value="true" />

这是蚂蚁的配置参数

<!-- ================== External Dependencies ======================= -->
<property name="LWJGL" value="lwjgl.jar" />
<property name="Timer" value="timer.jar" />
<property name="Database" value="hsqldb.jar" />
<property name="Splice" value="jarsplice-0.25.jar" />

在这里,您必须指定外部依赖项(如果您要创建测试目标,请使用easymock或powermock。

<!-- ================== Compilation Classpath ======================= -->
<path id="compile.classpath">
    <fileset dir="${src}">
        <include name="**/*.java" />
        <exclude name="**/server/*.java"/>
    </fileset>
    <fileset dir="${shared.lib}">
        <include name="**/*.jar" />
    </fileset>
</path>

这就是And(使用javac命令)将构建的,您必须指定要构建的所有文件夹并添加(使用<fileset> )构建路径中的任何jar

<!-- =================== All Target ================================ -->

<!-- ================== Try_jar Target ============================ -->
<target name="try_jar" depends="compile, dist, clean_class_files, run" description="Clean build and dist directories, then compile, create jar and finally run" />

这是我们的目标,在第一行的“默认”中指定,并将运行此目标。 取决于Ant告诉Ant在此目标之前应该做什么。 您可以读取它将编译,创建jar(dist),删除类文件,然后运行它。

<!-- ================== Clean Target ============================== -->

<target name="clean" description="Delete old build and dist directories">
    <delete dir="${build}" />
    <delete dir="${dist}" />
</target>

这很清楚,在编译新版本之前我们要删除任何旧的类文件以避免出现问题。 您可能认为永远不会调用它,但要注意每个目标的依赖关系。

<!-- ================== Prepare Target ============================= -->

<target name="prepare" depends="clean">
    <mkdir dir="${build}" />
    <mkdir dir="${build}/classes" />
    <mkdir dir="${build}/lib" />
    <copy todir="${build}/lib">
        <fileset dir="${shared.lib}" includes="${Timer}, ${LWJGL}, ${Database}" />
    </copy>
</target>

这将准备路径,创建新的所需文件夹(如构建和构建/类)并添加外部依赖项jar。

<!-- ================== Compile Target =========================== -->

<target name="compile" depends="prepare" description="Compile Java sources">

    <mkdir dir="${build}/classes" />
    <javac srcdir="${src}" destdir="${build}/classes" encoding="8859_1" debug="${compile.debug}" deprecation="${compile.deprecation}" optimize="${compile.optimize}" source="1.6" target="1.6">
        <classpath refid="compile.classpath" />
    </javac>
</target>

这是主要的编译目标,因为你可以看到它取决于prepare(取决于clean),所以直到现在我们使用所有<target>标记。
Ant使用<javac>标记编译.java文件,需要知道源文件的位置,放置.class文件的位置,编码以及我们之前指定的三个参数。

<!-- =================== Dist Target ================================ -->
<target name="dist" description="Creates Jar archive">
    <!-- Create the time stamp -->
    <tstamp>
        <format property="compile.timestamp" pattern="yyyyMMddHHmm" />
    </tstamp>
    <!-- update version in manifest -->
    <replaceregexp file="${basedir}/manifestClient" match="Implementation-Version: .*" replace="Implementation-Version: ${app.version}.${compile.timestamp}" />
    <!-- Create Jar file -->
    <jar destfile="${jar.completePath}" manifest="${basedir}/manifest">
        <fileset dir="${build}/classes" excludes="**/*.bak" />
        <fileset dir="${src}/" excludes="mh/" />
        <fileset dir="${shared.lib}/native/macosx" />
        <zipfileset src="${shared.lib}/${Timer}" />
        <zipfileset src="${shared.lib}/${LWJGL}" />
        <zipfileset src="${shared.lib}/${Database}" />
    </jar>
</target>

这创造了真正的罐子。 <tstamp><replaceregexp>用于更新清单中的版本,您可以删除它们。
Jar标签将创建.jar文件,我们在jar中指定要添加到我的类中的文件。 我们还要指定一个将在稍后讨论的清单。

<!-- =================== Delete .class Target===================== -->
<target name="clean_class_files" description="Delete .class files stored inside build directory and dist folder">
    <delete dir="${build}" />
    <delete dir="${dist}" />
</target>

此目标删除用于存储.class文件的两个文件夹(显然是内部的所有文件)。

<!-- ================== Run Target =============================== -->
<target name="run" description="Run MagicHogwarts">
    <java jar="${jar.completePath}" fork="true">
    </java>
</target>

build.xml文件的结尾,即运行jar的运行目标。

这几乎是你需要编译和正确的资源到一个罐子,如果有什么不像你期望的那样,只需尝试几次,一切都会正确。

这是显而易见的:

Manifest-Version: 1.0
Created-By: 1.6.0 (Sun Microsystems Inc.)
Main-Class: package.to.class.with.main
Built-by: Gianmarco
Implementation-Vendor: Gianmarco
Implementation-Title: Title

我希望这对你有用。

我正在编辑一些东西以使帖子更好,但没有内容会有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM