2015-01-13 4 views
0

Ну, это моя структура:Maven исполнимый банка не находит ресурсы

org 
---app 
---sqlite 
---jfreechart 
META-INF 
---services 
---maven 
---MANIFEST.mf 
com 
---keypoint 
db.sqlite 

Я пытаюсь поставить DB.SQLite все возможные папки, но всегда программа не может найти его.

Кроме того, мой pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

<build> 
    <resources> 
      <resource> 
       <directory> src/main/resource </directory> 
      </resource> 
    </resources> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.1</version> 
      <configuration> 
     <archive> 
        <manifest> 
        <mainClass>org.lorde.StockModule.App</mainClass> 
        </manifest> 
      </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 

      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> <!-- this is used for inheritance merges --> 
        <phase>package</phase> <!-- append to the packaging phase. --> 
        <goals> 
         <goal>attached</goal> <!-- goals == mojos --> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
      </configuration> 
      </plugin> 
     <plugin> 
     <artifactId>maven-remote-resources-plugin</artifactId> 
     <version>1.5</version> 
     <executions> 
      <execution> 
      <goals> 
       <goal>bundle</goal> 
      </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <includes> 
      <include>**/*.sql</include> 
      </includes> 
     </configuration> 
     </plugin> 
    </plugins> 
</build> 

    <groupId>org.lorde.StockModule</groupId> 
    <artifactId>StockApp</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>StockApp</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.xerial</groupId> 
     <artifactId>sqlite-jdbc</artifactId> 
     <version>3.8.7</version> 
    </dependency> 
    <dependency> 
     <groupId>jfree</groupId> 
     <artifactId>jfreechart</artifactId> 
     <version>1.0.13</version> 
    </dependency> 
    </dependencies> 
</project> 

На самом деле, специалист добавляет файлы пакета банку, но когда я нажимаю он не находит его. Если я люблю:

Java целевой -cp/STAK-с-dependency.jar org.lorde.Stock.App

Он работает, он находит его, так что может быть проблема?

Заранее спасибо

Edit: соответствующая часть кода.

{ 
     try 
      { 
       Class.forName("org.sqlite.JDBC"); 
      }catch(ClassNotFoundException e) 
      { 
       e.printStackTrace(); 
       JOptionPane.showMessageDialog(null,"error code = 0000"); 
      } 
    } 

    public dbConnect() 
    { 
     try 
      { 
       connect = DriverManager.getConnection("jdbc:sqlite:db.sqlite"); 
      }catch(SQLException ex) 
      { 
       JOptionPane.showMessageDialog(null,"error = 0001"); 
      } 
    } 
+0

Сообщите нам код, который используется для открытия базы данных. –

+0

У меня есть вопрос. –

ответ

2

Я предполагаю, что вы используете https://bitbucket.org/xerial/sqlite-jdbc в качестве драйвера JDBC.

Драйвер содержит общую библиотеку C++, которая реализует саму базу данных. C++ не имеет представления о ресурсах Java, поэтому нет способа создать путь, который будет показывать C++ «база данных внутри этого JAR там».

Обходным путем является извлечение ресурса из JAR в обычный файл с использованием кода Java. Впоследствии вы можете указать драйвер JDBC в этот новый (обычный) файл.

+0

Да, я использую этот драйвер jdbc, но, простите, я не понял, что вы имеете в виду во втором абзаце, можете ли вы быть немного больше spesific пожалуйста. –

+0

@VivianMaya: SQLite не может получить доступ к файлам внутри JAR. Вы должны оставить файл снаружи. Всегда используйте два файла ('Stak-with-dependency.jar' и' db.sqlite') или, когда Stak запускает, используйте 'getClass(). GetResource (" db.sqlite ")', чтобы получить 'InputStream' и скопируйте содержимое в файл на жестком диске. После этого вы можете указать sqlite в этот новый файл. –

0

Строка подключения jdbc:sqlite:db.sqlite не указывает абсолютное местоположение. Я предполагаю, что, поскольку sqlite основан на файлах, он будет искать файл относительно текущего каталога. Итак, поместите исполняемый JAR в ту же папку в ваш файл базы данных sqlite, а затем запустите его.

+0

Как я уже упоминал, я пытаюсь поместить каждую папку, которая уже не работает ... –

Смежные вопросы