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

时间:2013-09-08 10:06:09

标签: java eclipse jar executable-jar

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

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

我尝试了文件>导出> Java>可执行文件>保存在桌面上,但是当我双击它时,它无法启动。我试过cmd并且它有效,但有错误,它无法找到图像文件夹。

如何在双击

执行的单独目录中执行jar文件

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

ANT是The Way

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

来自ant.apache.org

  

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

     

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

     

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

     

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

     

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将做,并且被称为&#34;目标&#34;,你可以创建一个目标来完成所有事情或各种目标,每个目标做几件事,在这种情况下你可以创建不同的&#34;流程图&#34;蚂蚁将会跟随。例如我通常为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" />

这是ant的配置参数

<!-- ================== 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" />

这是我们的目标,如&#34;默认&#34;第一行,并将运行此。取决于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>

这是主要的编译目标,因为你可以看到它取决于准备(取决于干净),所以我们现在使用所有<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的运行目标。

这几乎是你需要编译和正确的资源到一个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

我希望这对你有用。

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