有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

Cuurent state 正如chris所建议的,我创建了一个最低限度的示例(基于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)! 所以我只是把上面的两行代码复制到我真正的应用程序中,构建它并将这两个文件复制到jar的文件夹中。但是现在两个系统输出都会产生“null”! 所以有些东西似乎在摆弄类路径/或者让我们忽略清单中的类路径? (在这两种情况下,打印输出类路径的输出是相同的-只打印出jar) 知道如何解决这个问题吗

原始问题:

我无法从当前目录中读取文件(属性)。以下是我的设置(基于maven): 读取文件:

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

在放置在resources/my中的my属性的测试中运行良好。财产

因为当前目录是默认的类路径,所以我认为它应该只用于放置我的。属性位于与jar相同的目录中,并从此目录运行java -jar,但它不起作用(资源流为null)。 然后我在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的副本 我可以从类路径加载资源。我将文件放在src/test/resource/my中。性质 Maven将它们与所有类一起复制,并且一切都很好。由于文件位于src/test/resources中,因此打包的jar中缺少该文件(如预期的)。用户必须给出一个my。属性来运行程序。我想从当前目录中读取这个文件(假设java-jar是从带有my.properties的jar目录中调用的),但这不起作用

编辑 maven程序集插件配置:

        <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) 个答案

  1. # 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 cfm MyJar.jar Manifest.txt Foo.class
    

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

    cd dirContainingJar
    java -jar MyJar.jar
    

    它打印为空,所以我

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

    它打印出来了

    v = java.io.BufferedInputStream@131b92e6