【问题标题】:Java Jar does not work in AndroidJava Jar 在 Android 中不起作用
【发布时间】:2015-12-29 17:09:52
【问题描述】:

我编写了一个小型 Java 应用程序,并将其编译成可执行的 jar 文件。该程序使用在 jar 文件中编译的 .txt 文件。为了访问 jar 中的 .txt 文件,您需要使用 ClassLoader.getSystemResourceAsSteam("");

下面是jar文件中的方法:

 private ArrayList<String> loadChainRestaurantsList() throws IOException {
        ArrayList chains = new ArrayList();
        InputStream in = ClassLoader.getSystemResourceAsStream("chains.txt");
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        String name;
        while((name = reader.readLine()) != null) {
            chains.add(name);
        }

        return chains;
    }

如果我从 cmd-line 将 jar 作为独立的 Java 程序或从 Eclipse 运行,则此代码有效。如果我将其导出为 jar,然后将其放入另一个 Java 程序并使用它,它甚至可以正常工作,它可以按预期工作。问题是当我将 jar 放入 Android 项目时。我收到此错误:

FATAL EXCEPTION: AsyncTask #1
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime: Process: com.jasonjohn.unchainedandroid, PID: 8821
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground()
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at android.os.AsyncTask$3.done(AsyncTask.java)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:  Caused by: java.lang.NullPointerException: lock == null
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.io.Reader.<init>(Reader.java:64)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.io.InputStreamReader.<init>(InputStreamReader.java:120)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.io.InputStreamReader.<init>(InputStreamReader.java:57)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at com.jasonjohn.unchainedapi.UnchainedAPI.loadChainRestaurantsList(UnchainedAPI.java:123)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at com.jasonjohn.unchainedapi.UnchainedAPI.getUnchainedRestaurants(UnchainedAPI.java:71)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at com.jasonjohn.unchainedandroid.MainActivity$UnchainedAsync.doInBackground(MainActivity.java:69)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at com.jasonjohn.unchainedandroid.MainActivity$UnchainedAsync.doInBackground(MainActivity.java:62)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java) 
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818) 

我以前从未见过此错误。谁能解释发生了什么?我假设 InputStream/InputStreamReader 为 null,但我不知道如何解决此问题。

【问题讨论】:

  • 什么?你为什么不把那个文本文件从罐子里拿出来呢?或者您解压缩 jar 并使用 stackoverflow.com/questions/1529611/… 使用文本文件
  • jar 中的 txt 是 jar 的组成部分。如果我把它拿出来,那么我必须把它带到我放罐子的任何地方。我宁愿把所有东西都打包到jar里,只需要处理一个文件
  • 考虑将 jar 重新打包为 aar 文件,以便您知道文本文件的位置:stackoverflow.com/questions/24309950/…
  • 它不是一个 Android 库,只是一个普通的 Java 程序,它被重新用作一个库。还可以用它来做aar吗?
  • 出于好奇,您为什么使用 getSystemResourceAsStream 而不是普通的旧 getResourceAsStream("/chains.txt")?

标签: java android maven jar classloader


【解决方案1】:

你应该使用

getResourceAsStream("/chains.txt")

而不是使用

getSystemResourceAsStream(...).

路径前面的 / 表示查看 jar 的根目录。否则,它将在与您获得类加载器的类相同的包中查找chains.txt。例如,如果你这样做:

package com.potter.harry;
...
InputStream is = this.getClass().getResourceAsStream("chains.txt");

引用的文件必须放在“/com/potter/harry/chains.txt” 在 zip 文件中。

【讨论】:

  • 完美!也 +1 解释!
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2012-08-05
  • 2012-11-04
  • 2012-03-28
相关资源
最近更新 更多