Maven包在jar包中打开一个文件(作为* File *)

时间:2010-11-26 16:07:09

标签: file maven-2 jar maven

我需要打开一个maven jar包内的文件。它是我使用的框架的模型配置,库类的构造函数需要传递类型为 File 的对象。我可以使用类加载器获得配置文件的路径,没有任何问题。但是 - 不幸的是 - File 无法读取jar内的文件。所以我得到 java.io.FileNotFoundException 。现在我正在为这个问题寻找解决方案。我的计划是解压缩模型配置文件并将其放在临时目录中。但是,在开始编码之前,我想了解是否有任何其他解决方案可以解决像我这样的问题。

更新:我需要在运行时读取文件。

2 个答案:

答案 0 :(得分:4)

如果您是从maven构建中执行此操作,请使用

将jar资源解压缩到文件中
  • dependency:unpack-dependencies(如果jar是项目的maven依赖项之一)

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

或使用

  • dependency:unpack(如果jar没有依赖关系,但仍可作为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>
    

答案 1 :(得分:3)

我认为你应该使用JarInputStream,逐个遍历JAR条目,直到找到你需要的东西。然后只找到read()的{​​{1}}内容。