来自JAR的资源访问问题

时间:2010-03-16 14:46:58

标签: java resources jar

我有一个项目的以下目录结构:

Folder "project" in Eclipse:
--folder "src"
--folder "resources"
----trayicon2.png
--folder "db" 
----test.db
--folder "bin" 

我正在访问图片:

Image image = Toolkit.getDefaultToolkit().getImage("resources/trayicon2.png");

来自Eclipse,这不是问题。 然后我生成一个“可执行jar文件”,并添加dirs,使目录结构为:

Folder "project"
--folder "db"
----test.db
--folder "resources"
----trayicon2.png
--project.jar 

现在图像不再可访问了。此外,数据库不再可访问;在Eclipse中,我曾经用以下方式访问它:

Connection conn = DriverManager.getConnection("jdbc:sqlite:db/test.db");

如何在生成jar文件“project.jar”后访问资源(图像和数据库)?

4 个答案:

答案 0 :(得分:2)

对于图像,试试这个:

URL imageURL = getClass().getResource("/resource/trayicon2.png"); // note leading slash
Image image = Toolkit.getDefaultToolkit().getImage(imageURL);

答案 1 :(得分:1)

当您处于eclipse时,您传递的文件名是相对的,并且使用由eclipse自动设置的类路径正确解析。尝试使用该方法的URL版本并将URL传递给您的jar文件。您可以看到example on this page

答案 2 :(得分:0)

您可能希望切换到ANT来构建jar文件。

您可以在jar中找到可以找到它们的图像资源,以及任何必需的库(例如sqlite的库,也可以放入jar中的lib文件夹中)。

这是一个示例构建文件:

<?xml version="1.0"?>
<project name="test" default="compile" basedir=".">
    <description>
            Generates jar for project
 </description>
 <property name="src.dir" value="${basedir}/src"/>
    <property name="build.dir" value="${basedir}/build"/>
    <property name="build.classes" value="${build.dir}/classes"/>
    <property name="build.jars" value="${build.dir}/jars"/>
    <target name="init">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.classes}"/>
        <mkdir dir="${build.jars}"/>
    </target>
    <path id="core.classpath">
        <fileset dir="${build.jars}">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <path id='lib.classpath'>
        <fileset dir='lib' />
    </path>

    <target name="compile" depends="init">
        <javac srcdir="${src.dir}" destdir="${build.classes}" debug="true">
            <classpath refid="lib.classpath"/>
        </javac>
    </target>

 <target name="copy-resources">
        <copy todir="${build.classes}">
            <fileset dir="${src.dir}">
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>

    <target name="jar" depends="compile, copy-resources">
        <jar destfile="${build.jars}/project.jar">
            <fileset dir="${build.classes}">
                <include name="**/*.class"/>
                <include name="**/*.properties"/>
                <include name="**/*.png"/>
            </fileset>
         <fileset dir=".">
          <include name="**/*.jar"/>
         </fileset>
         <manifest>
                <attribute name="Built-By" value="${user.name}"/>
             <attribute name="Main-Class" value="com.your.path.to.MainClass"/>
            </manifest>
        </jar>
    </target>

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

这假设您在src目录中有一些java文件,并且在lib文件夹中有一些库。所以你的路径看起来像这样:

Project
----------
-bin
-src
--com...
---MainClass (has a main method, runs your program)
---a.png (will be findable)
-lib
--jar files required by your project
build.xml
-----------

它还会复制src文件夹中的所有属性或png文件。

然后,您将在build.xml级别键入ANT jar以构建jar文件。

答案 3 :(得分:0)

您无法直接访问JAR文件中的资源。相反,您需要使用Class的URL getResource(String)(或InputStream getReourceAsStream(String))方法。

我不确定你如何在SQLite数据库中使用它。