2010-11-26 22 views
2

Je dois ouvrir un fichier qui se trouve dans un paquet maven jar. C'est une configuration de modèle pour un cadre que j'utilise et un constructeur d'une classe de bibliothèque nécessite de passer un objet de type Fichier. Je peux obtenir un chemin vers un fichier de configuration en utilisant le chargeur de classe sans aucun problème. Mais - malheureusement - Fichier ne peut pas lire un fichier à l'intérieur du pot. Donc, je reçois java.io.FileNotFoundException. Maintenant, je cherche une solution à ce problème. Mon plan est de décompresser le fichier de configuration du modèle et de le placer dans un répertoire temporaire. Cependant, avant de commencer le codage, j'aimerais savoir s'il existe une autre solution à un problème comme le mien.Paquet Maven ouvrir un fichier (en tant que * Fichier *) dans un paquet jar

MISE À JOUR: J'ai besoin de lire un fichier en cours d'exécution.

+0

Avez-vous besoin du fichier extrait/lu du fichier JAR au moment de la construction ou de l'exécution? Vous avez deux bonnes réponses ci-dessous, mais les deux accomplissent la tâche à différents moments dans les processus de développement et d'exécution. – jgifford25

Répondre

3

Je pense que vous devriez utiliser JarInputStream, traversant à travers les entrées JAR, un par un, jusqu'à ce que vous trouverez ce dont vous avez besoin. Ensuite, juste read() contenu de la trouvé JarEntry.

+0

Cela n'aidera pas si la bibliothèque a besoin d'un fichier –

+0

Eh bien, vous pouvez 'read()' à partir de JAR et enregistrer dans un 'File' temporaire. Même dans ce cas, il est plus efficace que de décompresser JAR dans un projet. – yegor256

+0

Merci pour votre indice, cela me permet de résoudre mon problème. J'ai utilisé ClassLoader pour trouver un fichier (un chemin dans un fichier jar), décompressé dans un répertoire temporaire, et l'ouvrir comme * FICHIER *. – Skarab

4

Si vous le faites à partir d'un build Maven, déballer la ressource jar à un fichier en utilisant

  • dependency:unpack-dependencies (si le pot est l'un des dependenies maven du projet)

    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
        <execution> 
        <id>unpack-dependencies</id> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>unpack-dependencies</goal> 
        </goals> 
        <configuration> 
         <includeGroupIds>the.groupId</includeGroupIds> 
         <includeArtifactIds>the.artifactId</includeArtifactIds> 
         <includes>**/path/to/your/resource.txt</includes> 
         <outputDirectory>where/do/you/want/it</outputDirectory> 
        </configuration> 
        </execution> 
    </executions> 
    </plugin> 
    

ou utiliser

  • dependency:unpack (si le pot est pas de dépendance, mais toujours disponible comme un artefact Maven)

    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
        <execution> 
        <id>unpack</id> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>unpack</goal> 
        </goals> 
        <configuration> 
         <artifactItems> 
         <artifactItem> 
          <groupId>the.groupid</groupId> 
          <artifactId>the.artifactid</artifactId> 
          <version>the.version</version> 
          <type>jar</type> 
          <outputDirectory>where/do/you/want/it</outputDirectory> 
          <includes>**/path/to/your/resource.txt</includes> 
         </artifactItem> 
         </artifactItems> 
        </configuration> 
        </execution> 
    </executions> 
    </plugin>