&引用;无主清单属性“;下载Java中的.jar文件后

&引用;无主清单属性“;下载Java中的.jar文件后,java,jar,manifest,Java,Jar,Manifest,我对这个问题很困惑。在运行这段代码的最初几次,它都没有发生,但在那之后,我无法让它再次运行。它只有在使用我的Java代码下载后才会中断。我的代码从我的网站下载了一个jar文件,然后使用ProcessBuilder运行它。最初几次都很好,但我又运行了几次,它开始给我带来了好处 在…\AppData\Local\GDRQ\bin\launch\u gdbotbin.jar中没有主清单属性 下面是我用来下载和运行jar文件的java代码: try { System.out.printl

我对这个问题很困惑。在运行这段代码的最初几次,它都没有发生,但在那之后,我无法让它再次运行。它只有在使用我的Java代码下载后才会中断。我的代码从我的网站下载了一个jar文件,然后使用ProcessBuilder运行它。最初几次都很好,但我又运行了几次,它开始给我带来了好处

在…\AppData\Local\GDRQ\bin\launch\u 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();
    }
试试看{
System.out.println(“开始更新…”);
File targetFile=新文件(System.getProperty(“user.home”)+“\\AppData\\Local\\GDRQ\\downloading\\launch\u gdbotbin.jar”);
URL downloadUrl=新URL(“http://www.dropmoose.com/gdbotpro/launch_gdbotbin.jar");
InputStream inStream=downloadUrl.openStream();
//System.out.println(inStream.available());
BufferedInputStream bufIn=新的BufferedInputStream(流内);
OutputStream out=新文件OutputStream(targetFile);
BufferedOutputStream bufOut=新的BufferedOutputStream(输出);
byte[]buffer=新字节[inStream.available()];
while(true){
int nRead=bufIn.read(buffer,0,buffer.length);

如果(nRead我实际上可以让您的代码运行:

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

  • 我取出了写设置文件的代码
  • 我拿出了做这个动作的密码

    文件.move(targetFile.getAbsoluteFile().toPath(),新文件(System.getProperty(“user.home”)+“\AppData\Local\GDRQ\bin\launch\u gdbotbin.jar”).toPath(),StandardCopyOption.REPLACE_EXISTING)

  • 你需要有

    字符串[]parm={“java”,“-jar”,System.getProperty(“user.home”)+“path/to/your/file/launch_gdbotbin.jar”}

  • 我把这个拿出来

  • 我会尝试复制我所做的,然后逐渐地将我删除的其他代码放回原处

  • 注意:现在只需每次手动删除launch\u gdbotbin.jar即可。

    parm字符串是什么样子的?String[]parm={“jar”,“jar”,System.getProperty(“user.home”)+“\\AppData\\Local\\GDRQ\\bin\\launch\u gdbotbin.jar”;您不想从java运行jar文件吗?如果我使用“java-jar路径/to/jar/file",它也做同样的事情。太棒了。我知道我们真的很接近了。尝试发回冲突代码的问题所在。这样我就可以将它添加到答案中,以备将来查看。我非常确定它正在将文件从下载文件夹移到bin文件夹。可能找不到该类,因为它正在更改正在运行。这很有意义。我想您调用Files.move的方式是异步的。我让它单独运行了大约一个小时,当我重新开始工作时,丢失清单的问题再次出现。我没有更改任何代码。我确保在更改任何奇怪的内容之前先运行它。所以您有了Files.move的c部分你出去了吗?一定有什么改变了。