2014-10-31 117 views
9

我正在用maven构建一个可执行的jar文件,这意味着您使用“java -jar file.jar”运行它。Maven:添加外部资源

我想在用户定义的属性(只是一个包含键/值的文件),在开发阶段我把我的“user.properties”文件放在maven/src/main/resources /文件夹中。

我的属性文件加载:

final Properties p = new Properties(); 
final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties"); 
p.load(resource); 

现在,我想保持该文件的JAR之外,并有这样的事情:

- execution_folder 
    |_ file.jar 
    |_ config 
     |_ user.properties 

我试图与Maven插件很多东西像maven-jar-plugin,maven-surefire-plugin和maven-resources-plugin,但我无法得到它的工作...

在此先感谢您的帮助!

+0

user.properties是一个单独的文本文件,您保存在您的jar旁边并希望在运行时读取?因为如果是这样...你可能应该像对待任何其他外部文件一样对待 – Deltharis 2014-10-31 10:19:42

+0

是的,它只是一个单独的文件,但事情是 1-我不知道用户将放置jar和配置文件的位置 2 - I有依赖关系使用的其他资源文件(数据库连接等) – GournaySylvain 2014-10-31 10:26:26

+0

如果你喜欢外面的属性文件,你需要设置类路径指向你的'executon_folder/config /'文件夹,否则你将无法访问你的用户。 properties'。所以一个简单的'java -jar file.jar'将不起作用。 – khmarbaise 2014-10-31 13:57:55

回答

13

我发现我只需要使用maven配置。

首先我config文件夹添加到类路径:

<build> 
<plugins> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.1</version> 
    <configuration> 
     <archive> 
      <manifestEntries> 
       <Class-Path>config/</Class-Path> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 
</plugins> 
</build> 

我加载资源,以同样的方式为前:

final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties"); 
p.load(resource); 

如果你想保持你的例子资源文件在您的回购和从您的内部删除他们:

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <excludes> 
       <exclude>user.properties</exclude> 
       <exclude>conf/hibernate.cfg.xml</exclude> 
      </excludes> 
     </resource> 
    </resources> 
</build> 

旁边的jar文件,我添加一个配置文件夹所有我需要的资源文件。

结果是:

  • user.properties可以使用的getResourceAsStream加载
  • 其他库依赖于特定的资源(我不会说,但我觉得......没有那么好)可以加载他们的资源没有任何问题。

感谢您的帮助,我希望这有助于某个人!

+0

我想要做同样的事情,但首先我需要获取jar文件旁边的configs目录。如何实现这一目标? – SachiDangalla 2018-02-26 08:58:08

+0

我真的不明白你的问题在我的情况下,配置文件没有存储在jar文件(排除在pom.xml文件中)。配置文件的创建和复制必须在部署端进行管理 – GournaySylvain 2018-02-26 09:29:14

+0

是的。我想要一种方法来获取jar外的配置文件夹,而无需手动拷贝或粘贴。你是怎么处理的呢? – SachiDangalla 2018-02-26 09:32:22

1

正如我在评论中提到的 - 它看起来像你想使用user.properties文件作为除了你的jar之外的文本文件。如果是这样的话,比使用它更简单 - 包含你的jar文件的目录是在运行时检查的当前目录。这意味着你需要的只是:

properties.load(new FileInputStream("config/user.properties")); 

没有试图放在项目classpath上。

如果还有其他工作要做,只需将资源目录中的属性复制到目标以避免手工操作的麻烦。这可以通过maven-antrun-plugin来实现:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <tasks> 
          <mkdir dir="${project.build.directory}" /> 
          <copy file="${basedir}/src/main/resources/user.properties" tofile="${project.build.directory}/config/user.properties" /> 
         </tasks> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

我理解你的解决方案,我可以用它来处理我的一些文件,但在我的资源中,我也有一个“hibernate.cfg.xml”和其他一些由我调用的库使用的文件。而这个库只是寻找资源文件(调用_getResourceAsStream_) – GournaySylvain 2014-11-03 16:02:26