【问题标题】:Export .jar with .txt as resource won't work使用 .txt 作为资源导出 .jar 将不起作用
【发布时间】:2013-01-31 00:18:18
【问题描述】:

我有一个关于 .jar 导出的问题。我必须在我的 jar 中包含一个 .txt 文件,从那里我将单词读入列表。我用这个来实现(在eclipse运行+调试模式下效果很好):

File file = new File(Worte.class.getClassLoader().getResource("resource/wortliste.txt").getFile());

现在,如果我将它导出到 JAR 文件中,JAR 文件应该是可执行的,并且它在资源中包含 list.txt 和 .java 文件(因为它是家庭作业;-)),但是程序的行为就像没有文件一样。当我使用 getResourceAsStream() 时,我遇到了同样的问题。有谁知道为什么这不起作用?我不明白这一点,因为我在 2 周前使用另一个代码完成了此操作,并且它可以正常工作。

我尝试过的:

  1. 删除项目并导入新项目
  2. 类似 1,但进入新工作区

我的系统是 Windows 7 x64 PC、Eclipse Juno 和 JRE7。

我用于导出的选项:

[] Export generated class files and resources 
[x] export all output folders... 
[x] export java source files... 
[] export refactorings

[x] compress the contents... 
[x] add directory entries 
[x] overwrite existing files without warning


jar tvf ...
    39 Wed Jan 30 16:19:14 CET 2013 META-INF/MANIFEST.MF
     0 Wed Jan 30 00:34:16 CET 2013 resource/
100250 Wed Jan 30 00:37:24 CET 2013 resource/wortliste.txt
     0 Wed Jan 30 00:34:16 CET 2013 wortspiel/
  1291 Wed Jan 30 01:19:14 CET 2013 wortspiel/BuchstabenKollektion.java
  2251 Sun Jan 27 16:24:42 CET 2013 wortspiel/TestBuchstabenKollektion.java
   506 Sun Jan 27 17:38:48 CET 2013 wortspiel/UI.java
  1187 Sun Jan 27 16:24:42 CET 2013 wortspiel/TestWorte.java
  2932 Wed Jan 30 01:25:00 CET 2013 wortspiel/WortspielGUI.java
  4384 Wed Jan 30 01:50:40 CET 2013 wortspiel/Worte.java
   310 Sun Jan 27 16:25:08 CET 2013 .classpath
   383 Sun Jan 27 16:22:32 CET 2013 .project
  1992 Wed Jan 30 16:02:12 CET 2013 wortspiel/BuchstabenKollektion.class
  2075 Wed Jan 30 16:02:12 CET 2013 wortspiel/TestBuchstabenKollektion.class
  1104 Wed Jan 30 16:02:12 CET 2013 wortspiel/TestWorte.class
   942 Wed Jan 30 16:02:12 CET 2013 wortspiel/UI.class
  4701 Wed Jan 30 16:02:12 CET 2013 wortspiel/Worte.class
   688 Wed Jan 30 16:02:12 CET 2013 wortspiel/WortspielGUI$1.class
   688 Wed Jan 30 16:02:12 CET 2013 wortspiel/WortspielGUI$2.class
  3475 Wed Jan 30 16:02:12 CET 2013 wortspiel/WortspielGUI.class

【问题讨论】:

  • 你能给我们列出罐子里的东西吗? jar tvf jarfilename
  • This 答案可能对您有所帮助。它解释了getResource 相对于调用它的类的类路径是如何工作的。根据我的经验,这很有可能是您的问题的根源。
  • 感谢 Henrik 的链接,但我也试过了:/我更新了 jar 内容@flup
  • jar 中没有 list.txt 文件。仅限worliste.txt
  • 是的,我更改了放入 stackoverflow 的条目 :) 在我的代码中它仍然是 wortliste.txt ;-)

标签: java eclipse


【解决方案1】:

您不能使用 java.io.File 来获取 jar 中文件的内容。尝试运行以下 sn -p,

public class TestGetResource
{
    public static void main(String[] args) throws Exception
    {
        URL url = TestGetResource.class.getResource("/resource/wortliste.txt");
        System.out.println("URL: " + url);
        File f = new File(url.getFile());
        System.out.println("File: " + f);
        System.out.println("File exists: " + f.exists());
        
        try {
            FileReader reader = new FileReader(f);        
            reader.read();
        } catch (FileNotFoundException notFoundEx) {
            System.out.println("Caught FileNotFoundException: " + notFoundEx.getMessage());
        }
    }

}

你应该会看到类似的东西,

网址:jar:file:/C:/some/path/my.jar!/resource/wortliste.txt

文件:file:\C:\some\path\my.jar!\resource\wortliste.txt

文件存在:假

Caught FileNotFoundException: file:\C:\some\path\my.jar!\resource\wortliste.txt(文件名、目录名或卷标语法不正确)

改为使用Class.getClassLoader().getResourceAsStream(String) 获取InputStream 来读取文件。如果您仍需要以 File 的形式读取内容,可以将内容流式传输到临时文件。

【讨论】:

    【解决方案2】:

    试试这个:

    URL url = Thread.currentThread().getContextClassLoader().getResource("resource/list.txt");

    文件文件 = 新文件(url.getFile());

    【讨论】:

    • 是的,我也试过了,没有变化。但它也应该和我的解决方案一样,不是吗?
    • 奇怪,这是我项目中的一段代码,它可以正常工作。
    • 是的,正如我在帖子中提到的那样。几周前我有这个,它工作正常。不明白...
    • 哦,我刚刚看到您指的是线程而不是主类。我试过了,但在.jar 导出后它也失败了。在 Eclipse RUN/DEBUG 中它可以工作:/
    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2014-09-22
    • 2013-04-28
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多