0

我正在构建一个依赖于一些配置文件的命令行工具。

在开发时,我将这些文件放在 下src/main/resources,并由 访问getClass().getResourceAsStream("/config-file-name"),效果很好。

我选择 maven-assembly-plugin 来构建具有所有依赖项的 jar。

    <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.myproject.Scheduler</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
               <execution>
                   <id>make-my-jar-with-dependencies</id>
                   <phase>package</phase>
                   <goals>
                       <goal>single</goal>
                   </goals>
               </execution>
            </executions>
    </plugin>       

配置文件都包装在jar中,但我想将它们分开。

所以,我添加以下配置,

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>conf.properties</include>
            </includes>
            <filtering>true</filtering>
            <excludes>
                <exclude></exclude>
            </excludes>
        <targetPath>..</targetPath>             
        </resource>
    </resources>

完成此操作后,配置文件与 jar 一起出现,而不是包装在 jar 中。

但是我的代码现在无法访问这些文件。

我是否需要更改在代码中访问文件的方式?

还是我不需要将这些文件放入src/main/resources/任何替代方案?

如果有人知道,请帮助。

谢谢。


更新:最后,我放弃使用 maven 资源文件,而是将文件路径默认设置为与 jar 相同的路径,一切正常,除了 Eclipse 抱怨。

由于我想将配置文件移出 jar,并且不希望它位于 target/classes 文件夹中,所以我使用<targetPath>..</targetPath>将配置文件移动到与 jar 文件相同的目录。

当我重新生成 Eclipse 项目设置时,Eclipse 说:不能在输出文件夹“project/target”内嵌套输出文件夹“project/target/test-classes”。

有人帮我吗?

4

3 回答 3

0

您的应用程序无法访问配置文件,因为它不再位于其类路径中。

如果您想将配置文件与应用程序的其余部分分开,您可能需要重新查看您的程序集格式。您可能希望使用 bin 而不是 jar-with-dependencies,尽管它在分发和使用方面存在挑战。

于 2012-03-08T07:29:57.393 回答
0

根据属性文件的复杂程度,您可以使用资源插件过滤器功能根据 Maven 配置文件更改值。例如,如果您想拥有一个名为 location 的属性,您可以定义一个开发和生产配置文件,然后将值设置为 pom 中的 maven 属性(如果您使用的是 maven 2,则设置为 profiles.xml):

<properties>
  <my.location>the_real_value</my.location>
</properties>

然后在属性文件中你会这样做:

location=${my.location}

只需确保在 pom 中设置了过滤,如下所示:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

构建时,如果您查看目标目录并查看该属性文件,您应该会看到替换的正确值。

于 2012-03-08T13:16:33.427 回答
0

我终于放弃了使用maven资源文件,默认将文件路径设置为与jar相同的路径,一切正常,除了Eclipse抱怨。

(由于我想将配置文件移出 jar,并且不希望它位于 target/classes 文件夹中,所以我使用 .. 将配置文件移动到与 jar 文件相同的目录。当我重新生成时eclipse项目设置,Eclipse说:不能在输出文件夹“project/target”内嵌套输出文件夹“project/target/test-classes”。)

直到现在我才找到解决方案,似乎是一个日食错误。

现在,我放弃了 Eclipse,改用 IntelliJ IDEA,它是一个相当不错的 IDE,尤其是与 Maven 完美集成。我会避免任何机会将 eclipse 用于任何 maven 项目。

于 2012-03-15T14:22:37.833 回答