2017-05-09 2 views
0

Je suis en train de créer un jar runnable d'une application Java. J'utilise Hibernate et Spring. Mon projet est un projet Maven avec la structure suivante:Comment faire pour distribuer l'application java avec SQLite

src 
-----/main 
----------/java 
---------------/com 
--------------------/project 
-------------------------/main.java 
----------/resources 
---------------/database.db 
pom.xml 

Ceci est une partie de mon fichier POM

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

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.1.RELEASE</version> 
     <relativePath/> 
    </parent> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- Spring --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.3.3.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>4.3.3.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <version>1.4.1.RELEASE</version> 
    </dependency> 

    <!-- Hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.5.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>4.3.5.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>4.3.3.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.xerial</groupId> 
     <artifactId>sqlite-jdbc</artifactId> 
     <version>3.15.1</version> 
    </dependency> 

    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.31</version> 
    </dependency> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

J'utilise hiberner pour communiquer avec une base de données SQLite pour effectuer lecture et d'écriture opérations . La configuration .xml pour mise en veille prolongée:

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <beans:property name="driverClassName" value="org.sqlite.JDBC" /> 
     <beans:property name="url" 
      value="jdbc:sqlite:src/main/resources/database.db" /> 
</beans:bean> 

Je voudrais être en mesure de distribuer l'application avec la base de données pour l'utilisateur à utiliser. J'ai lu que sqlite est une base de données intégrée. Cependant, j'ai également trouvé sur google mentions qu'il est lu seulement quand vous le mettez dans un .jar. Comment puis-je distribuer la base de données avec l'application de manière sécurisée? (sécurisé signifie qu'il ne peut pas être écrasé, ouvert ou lu facilement).

+1

le moment où vous expédiez la base de données au consommateur, il n'est plus sécurisé. Il est trivial d'extraire la base de données de jar (un jar est juste un zip), puis l'ouvrir dans un gestionnaire sqllite. Tout programme avec les bonnes autorisations pourrait le faire facilement. – Tschallacka

+0

@Tschallacka Je ne demande pas une sécurité complète et complète. Je veux juste être sûr que la base de données n'est pas facilement accessible et ne peut pas être écrasée facilement. – user3552551

+0

est-il une base de données en lecture seule statique? Si c'est le cas, appliquez un test de somme de contrôle avant d'effectuer l'interface. Effectuez une exception critique si elle est modifiée. – Tschallacka

Répondre

0

Vous êtes perdu dès que vous le remettez (comme l'a dit Tschallacka).

Vous avez quelques options ici (mais ils ne « réduire les dégâts »):

  • checksum (pour vérifier la cohérence de la base de données)
  • intégrer vos requêtes de création de bases de données à l'intérieur du code et, au cas où quelqu'un joué avec elle, recréer
  • utilisation dans une solution de mémoire à la place:

https://db.apache.org/derby/docs/10.11/devguide/cdevdvlpinmemdb.html https://sqlite.org/inmemorydb.html

Mais vous devez toujours protéger votre état enregistré (par ex. en le chiffrant).

+0

Cela serait encore lisible facilement en utilisant l'outil sqlite, sauf si vous utilisez le cryptage et inmemorydb mais avec certaines limitations (la mémoire elle-même). – AxelH

+0

Oui, bien sûr. C'est pourquoi j'ai déclaré qu'après avoir remis quoi que ce soit aux utilisateurs finaux, vous êtes sans défense. La seule chose que vous pouvez faire est de limiter les dégâts. – mko

+0

Depuis que vous avez suivi cette déclaration avec "_Vous avez peu d'options ici_", il n'était pas clair – AxelH