我有一个项目的以下目录结构:
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”后访问资源(图像和数据库)?
答案 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数据库中使用它。