【问题标题】:How to get a txt file from a jar in tomcat7如何从tomcat7中的jar中获取txt文件
【发布时间】:2012-12-23 16:56:13
【问题描述】:

我有一个txt 文件。我使用jar cf0... 将它打包在一个zip 和一个jar 中。我已经尝试了这两种方法以使其正常工作。

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/zip 放入WEB-INF/classesWEB-INF/lib

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

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

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

【问题讨论】:

  • 我把它当作你的模型。{jar,zip} 不在类路径中?
  • Get resource from jar 的可能重复项
  • 文件名前是否有下划线?如果是这样,您需要将其包含在路径中。
  • 只是为了确定,你能添加“jar tvf models.jar”的确切输出吗?
  • fge - 我相信 lib 和 classes 都在 tomcat 类路径中。 triton - 没有下划线。

标签: java jar tomcat7


【解决方案1】:

试试

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运行用户读取,不是吗?

【讨论】:

  • -1 我要求不要只是复制和粘贴。不,那行不通。
  • @TedTrippin 很奇怪,它已经在 jBoss AS 服务器上运行了大约 2 年。
  • @kutschkem 我同意你的看法。
  • 只是在 tomcat 下以我自己的用户身份在 windows 上运行。如果我自己部署文本文件,那么没有问题,只有当它在 jar/zip 中时。 jar tvf 确实显示了该文件。
  • @TedTrippin 您是将应用程序部署为战争、耳朵还是目录?代码是正确的,IT 必须工作。
【解决方案2】:

我认为问题在于 /subfolder/MyFile.txt 中的尾随 /

spring ClassPathResource 类使用几乎与您使用的操作相同的操作,但 javadoc states plainly

为 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();

【讨论】:

  • 我不同意,我总是使用前导“/”加载位于相对 pojos 的同一源中的属性文件,但我从未使用过 Spring
  • 如前所述,我已尝试将其放入 lib 和 classes 文件夹。不,不使用弹簧,只是尝试我在谷歌上搜索的不同示例。
  • 你能和Thread.currentThread().getContextClassLoader().getResourceAsStream("subfolder/MyFile.txt");联系吗
  • @TedTrippin mmm... 然后用斜杠?大声笑
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 2014-06-05
    • 2017-10-07
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多