【问题标题】:"no main manifest attribute" after downloading a .jar file in Java下载 Java 中的 .jar 文件后出现“无主清单属性”
【发布时间】:2016-08-19 13:17:58
【问题描述】:

我对这个问题很困惑。运行此代码的前几次并没有发生这种情况,但在那之后,我无法再次运行它。它仅在使用我的 Java 代码下载后才会中断。我的代码从我的网站下载了一个 jar 文件,然后使用 ProcessBuilder 运行它。前几次一切正常,但我又运行了几次,它开始给我效果

没有主清单属性,在 ...\AppData\Local\GDRQ\bin\launch_gdbotbin.jar 中

这是我用来下载和运行jar文件的java代码:

try {
        System.out.println("starting update...");

        File targetFile = new File(System.getProperty("user.home") + "\\AppData\\Local\\GDRQ\\downloading\\launch_gdbotbin.jar");
        URL downloadUrl = new URL("http://www.dropmoose.com/gdbotpro/launch_gdbotbin.jar");

        InputStream inStream = downloadUrl.openStream();
        //System.out.println(inStream.available());
        BufferedInputStream bufIn = new BufferedInputStream(inStream);
        OutputStream out = new FileOutputStream(targetFile);
        BufferedOutputStream bufOut = new BufferedOutputStream(out);
        byte[] buffer = new byte[inStream.available()];

        while (true) {
            int nRead = bufIn.read(buffer, 0, buffer.length);

            if (nRead <= 0) {
                break;
            }

            bufOut.write(buffer, 0, nRead);
        }

        bufOut.flush();
        out.close();
        inStream.close();

        BufferedWriter bw = new BufferedWriter(new FileWriter(settingsFile));
        for (int i = 0; i < settings.size(); i++) {
            bw.write(settings.get(i));
            bw.newLine();
        }

        bw.close();
        System.out.println("update successful");
        infoPane.dispose();

        System.out.println("cleaning up...");
        Files.move(targetFile.getAbsoluteFile().toPath(), new File(System.getProperty("user.home") + "\\AppData\\Local\\GDRQ\\bin\\launch_gdbotbin.jar").toPath(), StandardCopyOption.REPLACE_EXISTING);
    } catch (Exception e) {
        JOptionPane.showConfirmDialog(null, "An error occured (code 14): Unable to update!");
        infoPane.dispose();
    }

String[] parm = {"jar", "-jar", System.getProperty("user.home") + "\\AppData\\Local\\GDRQ\\bin\\launch_gdbotbin.jar"};

ProcessBuilder pb = new ProcessBuilder(parm);
    pb.redirectOutput(Redirect.INHERIT);
    pb.redirectError(Redirect.INHERIT);

    try {
        pb.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

我尝试使用 main(String[] args) 方法和 Manifest-Version: 1.0 创建一个以 Class-Path 作为类的 MANIFEST.MF 文件,但它仍然不起作用。我做错了什么,为什么我的 manifest.mf 文件不起作用?代码下载的jar在原来是2.5MB的情况下也是125KB左右。

编辑如果你去下载jar文件的代码中的url然后运行它,它运行得很好。

EDIT 2 我什至尝试使用 WinRAR 进入下载的 jar 文件并手动更改 META-INF/MANIFEST.MF 文件以正确设置 Main-Class,然后这样做还是没跑。

EDIT 3 清单问题消失了。但是现在我在加载引用的库时遇到了问题。我正在使用 PircBotX,当你运行 jar 文件时(使用 String[] parm = {"java", "launch_gdbotbin.jar", "gd.bot.main.BotHandler"})它会抛出 ClassNotFoundException。

EDIT 4即使在我按照 Micheal Markidis 的建议进行操作之后,它也开始再次出现 no main manifeset 属性错误。

【问题讨论】:

  • parm 字符串是什么样的?
  • String[] parm = {"jar", "-jar", System.getProperty("user.home") + "\\AppData\\Local\\GDRQ\\bin\\launch_gdbotbin .jar"};
  • 你不是在尝试从java运行jar文件吗?你不改用java命令吗?
  • 如果我使用“java -jar path/to/jar/file”,它会做同样的事情。

标签: java jar manifest


【解决方案1】:

我实际上可以让你的代码运行:

我为我的环境所做的改变:

  1. 我取出了写设置文件的代码
  2. 我取出了移动的代码

    Files.move(targetFile.getAbsoluteFile().toPath(), new File(System.getProperty("user.home") + "\AppData\Local\GDRQ\bin\launch_gdbotbin.jar").toPath() , StandardCopyOption.REPLACE_EXISTING);

  3. 你需要有

    String[] parm = {"java", "-jar", System.getProperty("user.home") + "path/to/your/file/launch_gdbotbin.jar"} ;

我得到了这个

  1. 我会尝试复制我所做的,然后逐步放回我删除的其他代码。

注意:现在每次手动删除launch_gdbotbin.jar即可。

【讨论】:

  • 太棒了。我知道我们真的很亲近。尝试发回冲突代码的问题所在。这样我就可以将其添加到答案中以供将来查看。
  • 我很确定它正在将文件从下载文件夹移动到 bin 文件夹。可能找不到该类,因为它在运行的同时发生了变化。
  • 这是有道理的。我猜你调用 Files.move 的方式是异步的。
  • 我把它搁置了大约一个小时,当我重新开始工作时,又出现了缺少清单的问题。我没有更改任何代码。我确保它在更改任何内容之前先运行
  • 这很奇怪。所以你已经注释掉了 Files.move 部分?一定有什么改变了。
猜你喜欢
  • 2017-08-18
  • 2020-08-06
  • 2015-09-23
  • 2018-06-17
  • 2014-09-01
  • 2011-02-05
  • 2012-08-29
  • 2020-07-28
  • 2015-10-01
相关资源
最近更新 更多