2

我有一个txt文件。我已经将它打包在一个 zip 和一个 jar 中,使用jar cf0.... 我已经尝试过这两种方法来让它发挥作用。

models.zip/models.jar
 |
 |_subfolder
     |
     |_MyFile.txt

在某些代码中,我有...

InputStream in = getClass().getClassLoader().getResourceAsStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

我已经尝试设置路径...

MyFile.txt
/MyFile.txt
/subfolder/MyFile.txt
classpath:/subfolder/MyFile.txt
models.zip/subfolder/MyFile.txt
models.jar/subfolder/MyFile.txt
models.zip!/subfolder/MyFile.txt
models.jar!/subfolder/MyFile.txt

我也试过把jar/zipinWEB-INF/classesWEB-INF/lib.

这些都不起作用,in始终为空。

你知道,当我把 MyFile.txt 放在 WEB-INF/classes 中时,我可以得到它。

请提供一个久经考验的答案!请不要只是从另一个答案中复制和粘贴代码。

4

3 回答 3

2

尝试

InputStream is = getClass().getClassLoader().getResourceAsStream  ("/subfolder/MyFile.txt");

并将您的 jar 文件放入 WEB-INF/lib/

编辑:您应该相信自己的代码,这是我正在运行的 web 应用程序的一个片段。类在包“it.sft.utils.props”中,相关属性文件通过 ant int 打包在同一个 jar 的同一个文件夹中。这完美无缺。

在您的特定场景中,您的类路径中可能没有 jar

 private void loadFromProperties() throws IOException {
            if (currencies == null) {
                currencies = new Properties();
                InputStream is = this.getClass().getClassLoader().getResourceAsStream  ("/it/sft/utils/props/currencies.props");
            if (is != null) {

                currencies.load(is );

                for (String key : currencies.stringPropertyNames()) {
                    String value = currencies.getProperty(key);
                    try {
                        String [] tmp = value.split(",");
                        String code = tmp[0];
                        int decs = Integer.parseInt(tmp[1]);
                        String text = tmp[2];
                        Logger.getLogger(CurrencyResolver.class).debug("Adding " + key + " with code " + code + " [" + text + "]");
                        storeValutaIso4217(new ValutaIso4217(key, code, decs, text));
                    }catch (Exception e) {
                        // Ignore
                        Logger.getLogger(CurrencyResolver.class).warn("Cannot handle " + key + " >" + value + "<");
                    }
                }
            }
        }
    }

还是您偶然从某种 IDE(NetBeans 或 Eclipse)运行它?

只是因为偏执: jar 文件实际上可以被 tomcat 运行用户读取,不是吗?

于 2013-01-09T15:35:25.500 回答
1

我认为问题/在于/subfolder/MyFile.txt.

spring ClassPathResource类使用几乎与您使用的操作相同的操作,但javadoc 明确指出

为 ClassLoader 使用创建一个新的 ClassPathResource。前导斜杠将被删除,因为 ClassLoader 资源访问方法将不接受它。

因此,如果没有弹簧,它将是:

Thread.currentThread().getContextClassLoader().getResourceAsStream("subfolder/M‌​yFile.txt");

此外,您的 jar 必须放入,WEB-INF/lib或者如果您想单独放入文本文件,请将其放入WEB-INF/classes/subfolder/.

如果您使用的是spring(我的猜测是因为您使用的是伪url类路径:)直接使用这个:

InputStream is = new ClassPathResource("subfolder/MyFile.txt").getInputStream();
于 2013-01-09T15:40:57.223 回答
1

我觉得自己像个笨蛋!问题是在 lib 和 classes 文件夹中都有 models.jar。它应该只是在 lib 文件夹中。

于 2013-01-09T16:28:20.747 回答