我正在使用eclipse,而且我在创建jar文件时遇到了困难。
所以我有像getClass().getResource("/imagesfolder/dog.jpg")
这样的代码。
如何创建Jar文件,以便包含我的图像的文件夹也包含在内。因为如果我的Jar文件不在包含类文件和images文件夹的bin文件夹中,则会发生错误。
我尝试了文件>导出> Java>可执行文件>保存在桌面上,但是当我双击它时,它无法启动。我试过cmd并且它有效,但有错误,它无法找到图像文件夹。
如何在双击
执行的单独目录中执行jar文件答案 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)
在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的一部分。
使用谷歌搜索,你会发现许多文档,我将展示基本的方法。
首先创建一个新文件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
我希望这对你有用。
我正在编辑一些东西以使帖子更好,但没有内容会有所不同。