Проблема с доступом к ресурсам из JAR - PullRequest
0 голосов
/ 16 марта 2010

У меня следующая структура каталогов проекта:

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» и добавляю каталоги, создавая структуру каталогов:

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 ]

2 голосов
/ 16 марта 2010

Для изображения попробуйте это:

URL imageURL = getClass().getResource("/resource/trayicon2.png"); // note leading slash
Image image = Toolkit.getDefaultToolkit().getImage(imageURL);
1 голос
/ 16 марта 2010

Когда вы находитесь в затмении, имя файла, которое вы передаете, является относительным, и оно правильно разрешается с помощью classpath, который автоматически устанавливается eclipse. Попробуйте использовать URL-версию метода и передайте URL в файл JAR. Вы можете увидеть пример на этой странице

0 голосов
/ 16 марта 2010

Вы не можете получить доступ к ресурсам внутри файла JAR напрямую. Вместо этого вам нужно использовать методы класса URL getResource(String) (или InputStream getReourceAsStream(String)).

Я не совсем уверен, как бы вы использовали это с базой данных SQLite.

0 голосов
/ 16 марта 2010

Возможно, вы захотите переключиться на ANT для создания ваших файлов JAR.

Вы можете встроить ресурсы изображений в jar, где их можно найти, и любые необходимые библиотеки (например, библиотеки для sqlite, также помещенные в папку lib внутри jar).

Вот пример файла сборки:

<?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>

Это предполагает, что у вас есть несколько java-файлов в каталоге src, а некоторые библиотеки в папке 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
-----------

Он также будет копировать любые свойства или файлы png, которые есть в папках src.

Затем вы должны набрать ANT jar на уровне build.xml, чтобы создать файл jar.

...