无法将当前目录添加到类路径

时间:2014-06-25 14:13:21

标签: java classpath

Cuurent州 正如克里斯建议我创建了一个最小的例子(基于maven):

public class MainApp {
    public static void main(String[] args) {
        System.out.println(MainApp.class.getResourceAsStream("/my.properties"));
        System.out.println(MainApp.class.getClassLoader().getResourceAsStream("their.properties"));
    }
}

这是有效的(与我的不工作应用程序中的maven配置相同,并且在同一位置使用相同的MANIFEST.MF)! 所以我只是将上面的2行复制到我的真实应用程序中,构建它并将2个文件复制到jar的文件夹中。但现在两个sysouts都会产生“null”! 所以似乎有些东西似乎在使用classpath /或者忽略来自manifest的classpath? (打印出类路径的输出在两种情况下都相同 - 只打印出jar) 知道如何解决问题吗?

原始问题:

我从当前目录中读取文件(属性)时遇到问题。这是我的设置(基于maven): 阅读文件:

MyClass.class.getClassLoader().getResourceAsStream("my.properties")

在我的属性置于resources / my.properties中的测试中正常工作。

由于当前目录是默认的类路径,我认为它应该只是将my.properties放在与jar相同的目录中并从此目录运行java -jar,但它不起作用(资源流为空) 。 然后我添加奇数代码到main打印出类路径:

String classpath = System.getProperty("java.class.path");
String[] classpathEntries = classpath.split(File.pathSeparator);
for (int i = 0; i < classpathEntries.length; i++) {
    System.out.println(classpathEntries[i]);
}

我还尝试了其他一些代码但在这两种情况下只打印出我的jar文件的路径。所以我试着添加'。'通过使用maven程序集插件来显示。从清单:

...
Class-Path: .
...

但这并没有帮助。那么如何让我的程序从当前目录加载getClassLoader().getResourceAsStream(my.properties)

为什么这不是this 的重复 从classpath加载资源没有问题。我把文件放在src / test / resource / my.properties中 Maven将它们与所有类一起复制,一切正常。由于该文件位于src / test / resources中,因此在打包的jar中缺失(按预期)。用户必须提供my.properties才能运行该程序。我想从当前目录中读取这个文件(假设java-jar是从带有my.properties的jar目录调用的)但这不起作用!

修改 maven-assembly-plugin config:

        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
                <manifest>
                    <mainClass>some.pkg.MainApp</mainClass>
                </manifest>
                <manifestEntries>
                    <Class-Path>.</Class-Path>
                </manifestEntries>
            </archive>
        </configuration>

这导致显示... jar / META-INF / MANIFEST.MF

1 个答案:

答案 0 :(得分:1)

在Ubuntu上运行Java 1.7.0_51-b13(Oracle),你的方法对我来说很好。因此,版本引入的差异或运行测试的方式都有微妙的变化。以下是我运行测试的方法,也许它可以帮助您进一步诊断。

这是我使用的清单

Manifest-Version: 1.0
Class-Path: .
Main-Class: Foo
Created-By: 1.7.0_06 (Oracle Corporation)

代码

public class Foo {

    public static void main( String[] args ) {
      Object v = Foo.class.getClassLoader().getResourceAsStream("my.properties");

      System.out.println( "v = " + v );
    }
}

我按如下方式创建了jar:

jar cfm MyJar.jar Manifest.txt Foo.class

然后我将jar移动到自己的目录中并运行

cd dirContainingJar
java -jar MyJar.jar

并且它打印为null,所以我接着

echo Hello > my.properties
java -jar MyJar.jar

并打印

v = java.io.BufferedInputStream@131b92e6