getResource()没有在classpath上找到资源

时间:2013-01-07 20:00:31

标签: java maven classpath classloader

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

所以资源在classpath上,带有资源的目录被复制到最终的jar中。

我的清单看起来像这样:“Class-Path:config / database.properties”

但我无法阅读它:

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

我尝试了绝对/相对路径getClass()/ClassLoader。没有。它在NetBeans中完美运行,但就是这样。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我不明白为什么要排除它。 Maven使用自己的资源dir。 项目 | - pom.xml -- src - 主要         ` - 资源 它让程序员的生活变得更轻松。当你使用这种方式时,不需要获得classpatch或其他。