0

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

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

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

我将如何在一个单独的目录中创建一个双击执行的 jar 文件

4

2 回答 2

1

蚂蚁是方式

在 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 软件基金会的一部分。

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


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。我会显示你是基本的 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" />

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

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

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

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

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

这准备了路径,创建新的所需文件夹(如 build 和 build/classes)并添加外部依赖项 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 使用标签编译 .java 文件<javac>,它需要知道源文件在哪里、在哪里放置 .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

我希望这对你有用。

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

于 2013-09-08T11:25:54.753 回答
1

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

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

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

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

于 2013-09-08T11:23:24.400 回答