2

我已经在 java SE 中设置了基本的 maven 项目,并带有一个资源:

main 
  -java
  -resources
    -config -> database.properties

现在因为我不想在最终的 jar 中使用这个资源,所以我定义:

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <excludes>
                    <exclude>config/database.properties</exclude>
                </excludes>
            </configuration>
            <executions>
                <execution>
                    <id>make-jar-ultimateParser</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/dist</outputDirectory>
                        <finalName>testApp</finalName>
                        <archive>
                            <compress>false</compress>
                            <!-- Manifest - MainClass & ClassPath -->
                            <manifest>
                                <mainClass>aa.bb.Class</mainClass>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib/</classpathPrefix>
                            </manifest>
                            <manifestEntries>
                                <Class-Path>config/database.properties</Class-Path>
                            </manifestEntries>
                        </archive>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Copy configuration files -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/dist/config</outputDirectory>
                        <resources>
                            <resource>
                                <directory>src/main/resources/config</directory>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>

因此资源位于类路径中,并且包含资源的目录被复制到最终的 jar 中。

我的清单如下所示:“Class-Path: config/database.properties”

但我无法阅读它:

String db = "/config/database.properties";
properties = new Properties();
properties.load(getClass().getResourceAsStream(db));

我尝试了绝对/相对路径,getClass()/ClassLoader. 没有什么。它在 NetBeans 中完美运行,仅此而已。

4

2 回答 2

1

您误解了 Maven 资源插件的作用。它只是将资源(可能带有转换)复制到构建输出目录中。然后将它们包含在构建工件(JAR、WAR 等)中。

为了使这项工作(使用Class-Path清单条目引用 JAR 的目录),您需要单独分发配置文件。或者使用 a 引用它File,而不用打扰类路径。

更好的方法是将应用程序作为程序集分发,其中包含核心应用程序、任何依赖项和配置文件。这通常会打包为 ZIP 文件,用户将其解压缩以进行安装。

于 2013-01-07T20:31:40.460 回答
0

我不明白你为什么要排除它。Maven 使用自己的资源目录。项目 |-- pom.xml -- src -- main `- 资源,它使程序员的生活更轻松。当您使用这种方式时,无需获取类补丁或其他。

于 2014-08-31T01:29:10.500 回答