2015-01-13 36 views
0

好了,这是我的结构:行家可执行的JAR没有找到资源

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> 

其实,行家将文件添加到jar包,但是当我点击它没有找到它。 如果我不喜欢:

java命令的目标/ STAK与 - dependency.jar org.lorde.Stock.App

它的工作原理,它发现它如此可能是什么问题?

在此先感谢

编辑:相关部分的代码。

{ 
     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里面”。

解决方法是使用Java代码将资源从JAR中提取到普通文件中。之后,您可以将JDBC驱动程序指向这个新的(普通)文件。

+0

是的,我使用该jdbc驱动程序,但原谅我我没有得到它你的意思是在第二段,你能成为一个请稍微特别说明一下。 –

+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

正如我所说我试图把每个possbile文件夹已经不起作用... –