java - 下载时 JAR 不兼容

标签 java windows jar download

我为 GUI 更新系统创建了一个 JAR,该系统在其内部下载一个可执行文件并执行它。每当我运行原始副本时,这对我来说都是完美的。然而,当从互联网下载时,GUI 就崩溃了。标题字体恢复为原始字体,下载按钮激活预定的对话框,但其中不执行任何下载文件的操作。请记住,我的 setup.jar 的原始副本可以工作,但下载的版本没有任何作用。

可以找到该 JAR here ,但专门用于直接下载,您可能会找到它 here

以下是我的 JAVA 文件的内容以及 JAR 层次结构的图片:

public class UpdateMechanism extends JFrame
                                implements ActionListener {
    protected static JButton aroundTheLake; 
    protected static JFrame frame;

    private static JButton aroundTheRiver() {
        aroundTheLake = new JButton("DOWNLOAD & INSTALL!");
        aroundTheLake.setVerticalTextPosition(AbstractButton.CENTER);
        aroundTheLake.setHorizontalTextPosition(AbstractButton.LEADING); //aka LEFT, for left-to-right locales
        aroundTheLake.addActionListener(new UpdateMechanism());
        aroundTheLake.setMnemonic(KeyEvent.VK_D);
        aroundTheLake.setActionCommand("aroundthelake");
        return aroundTheLake;
    }

    private static String readURL(String targetURL) {
        String returnish = "";
        try {
            URL tempURL = new URL(targetURL); 
            Scanner s = new Scanner(tempURL.openStream()); 
            while (s.hasNextLine()) {
                returnish = returnish+s.nextLine(); 
            }
        } catch (IOException e) {
            System.out.println(e); 
        }
        return returnish;
    }

    private static String readFile(String targetFile) { 
        String returnString = "";
        try {
            File tempFile = new File(targetFile);
            Scanner s = new Scanner(tempFile);
            while (s.hasNextLine()) {
                returnString = returnString + s.nextLine(); 
            }
        } catch(IOException e) { 
            // !
            System.out.println(e);
        }
        return returnString;
    }

    public void actionPerformed(ActionEvent e) {
        if ("aroundthelake".equals(e.getActionCommand())) {
            JOptionPane.showMessageDialog(frame,
                                            "Please wait, this may take a while depending on your connection...");
            new Thread() {
                public void run() {
                    URL url; 
                    URLConnection con;  
                    DataInputStream dis;  
                    FileOutputStream fos; 
                    byte[] fileData;  
                    try {
                        url = new URL("http://hivelocity.dl.sourceforge.net/project/theneverhood/setup.exe");
                        con = url.openConnection(); 
                        dis = new DataInputStream(con.getInputStream());
                        fileData = new byte[con.getContentLength()]; 
                        for (int x = 0; x < fileData.length; x++) { 
                            fileData[x] = dis.readByte();
                        }
                        dis.close(); 
                        fos = new FileOutputStream(new File("executable/setup.exe"));  
                        fos.write(fileData);
                        fos.close(); 
                        Runtime.getRuntime().exec("executable/setup.exe", null, new File("executable/"));
                    }
                    catch(MalformedURLException m) {
                        System.out.println(m);
                    }
                    catch(IOException io) {
                        System.out.println(io);
                    }
                }   
            }.start();
        } else {
            // man
        }
    }

    private static void showGUI() {
        frame = new JFrame("The Neverhood Restoration Project");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(1024, 600));
        frame.setExtendedState(frame.MAXIMIZED_BOTH);
        frame.getContentPane().setBackground(new Color(0xA64343));

        File fileCheck = new File("C:/Program Files (x86)");
        String returnString = null;
        String rootDirectory = null;
        if (fileCheck.exists()) {
            rootDirectory = "C:/Program Files (x86)/DreamWorks Interactive"; 
            String checkFile = rootDirectory+"/Neverhood/version.txt"; 
            File tempFile = new File(checkFile);
            if (tempFile.exists()) {
                returnString = readFile(checkFile);
            } else {
                returnString = "It appears you do not have the Neverhood Restoration Project installed, or you are using an earlier version."; 
            }
        } else {
            rootDirectory = "C:/Program Files/DreamWorks Interactive";
            String checkFile = rootDirectory+"/Neverhood/version.txt"; 
            File tempFile = new File(checkFile);
            if (tempFile.exists()) {
                returnString = readFile(checkFile);
            } else {
                returnString = "It appears you do not have the Neverhood Restoration Project installed, or you are using an earlier version.";
            }
        }
        if (returnString.equals(readURL("http://theneverhood.sourceforge.net/version.txt"))) {
            returnString = "You are updated to the recent version!"; 
        } else { 
            returnString = "It appears you're not updated.";
        }

        JLabel headerLabel = new JLabel("The Neverhood Restoration Project");
        headerLabel.setHorizontalAlignment(JLabel.CENTER);
        JPanel heapPanel = new JPanel();
        heapPanel.setLayout(new BoxLayout(heapPanel, BoxLayout.PAGE_AXIS));
        heapPanel.setPreferredSize(new Dimension(500, heapPanel.getPreferredSize().height));
        JTextArea heapLabel = new JTextArea(50, 50);        
        heapLabel.setLineWrap(true);
        heapLabel.setWrapStyleWord(true);
        heapLabel.setEditable(false);
        heapLabel.setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 20));
        heapLabel.setFont(new Font("Serif", Font.PLAIN, 14));
        heapLabel.append("Current version: "+readURL("http://theneverhood.sourceforge.net/prettyversion.txt")+".\nInstalled version: "+readFile(rootDirectory+"/Neverhood/prettyversion.txt")+".\n"+returnString+"\n" + 
            "You can read the full version of the document to the left at http://theneverhood.sourceforge.net."
            + "\nHaven't installed yet? Below is the download button. Just click to save setup.exe in and enjoy!");
        heapPanel.add(heapLabel);
        if (returnString == "It appears you're not updated.") { 
            heapPanel.add(aroundTheRiver());
        }

        try {
            Font sFont = Font.createFont(Font.TRUETYPE_FONT, new File("DUGFB___.TTF"));
            sFont = sFont.deriveFont(Font.PLAIN, 48);
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(sFont);
            headerLabel.setFont(sFont);
        } catch (FontFormatException | IOException e) {
            System.out.println(e);
        }

        BufferedImage icoImage = null;
        try {
            icoImage = ImageIO.read(
                frame.getClass().getResource("/nhood.bmp"));
        } catch (IOException e) {
            System.out.println(e);
        }
        frame.setIconImage(icoImage);

        JEditorPane updateLog = new JEditorPane();
        JScrollPane scrollPane = new JScrollPane(updateLog);
        updateLog.setEditable(false);

        try {
            updateLog.setPage("http://theneverhood.sourceforge.net/");
        } catch (IOException e) {
            updateLog.setContentType("text/html");
            updateLog.setText("<html>The application could not load the webpage.</html>");
        }

        frame.add(headerLabel, BorderLayout.NORTH);
        frame.add(scrollPane);
        frame.add(heapPanel, BorderLayout.EAST);
        frame.pack();
        frame.setVisible(true);
    }


    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                showGUI();
            }
        });
    }
}

The poorly illustrated arrow points to "executable," not META-INF.

这张图片是从提供的链接下载的。 The JAR when downloaded from the Internet.

最佳答案

代码中有很多小错误:

    new Thread() {
            public void run() {
                URL url; 
                URLConnection con;  
                DataInputStream dis;  
                FileOutputStream fos; 
                byte[] fileData;  
                try {
                    url = new URL("http://hivelocity.dl.sourceforge.net/project/theneverhood/setup.exe");
                    con = url.openConnection(); 
                    dis = new DataInputStream(con.getInputStream());
                    fileData = new byte[con.getContentLength()]; 
                    for (int x = 0; x < fileData.length; x++) { 
                        fileData[x] = dis.readByte();
                    }
                    dis.close(); 
                    File f = new File("executable");
                    if(!f.isDirectory())
                        f.mkdir();
                    fos = new FileOutputStream(new File("executable/setup.exe"));  
                    fos.write(fileData);
                    fos.close(); 

                    Runtime.getRuntime().exec("executable/setup.exe", null, new File("executable/"));
                }
                catch(MalformedURLException m) {
                    System.out.println(m);
                }
                catch(IOException io) {
                    System.out.println(io);
                }
            }   
        }.start();

另外,我建议使用 ProcessBuilder 而不是 Runtime。 示例:

    List<String> command = new ArrayList<String>();
    command.add("cmd");
    command.add("/C");
    File dcr = new File("executable/setup.exe");
    dcr.setExecutable(true, false);
    command.add(dcr.getAbsolutePath());
    ProcessBuilder builder = new ProcessBuilder(command);
    builder.redirectErrorStream(true);
    final Process process = builder.start();
    try {
        process.waitFor();
    } catch (InterruptedException ex) {
        Logger.getLogger(WhatEver.class.getName()).log(Level.SEVERE, null, ex);
        throw ex;
    }
    InputStream is = process.getErrorStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line;
    while ((line = br.readLine()) != null) {
        Logger.getLogger(Thumbnail.class.getName()).severe(line);
    }

其次,Font 不正确,因为它在

处抛出异常

Font sFont = Font.createFont(Font.TRUETYPE_FONT, new File("DUGFB___.TTF")); 因此字体不符合预期。

同时将 returnString == "看来您没有更新。" 更改为 returnString.equals("看来您没有更新。")

关于java - 下载时 JAR 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801837/

相关文章:

java - Spring Cloud Stream 中的 Autowiring 问题

java - 两类总和

c# - 作为 MDI 子窗口的程序

java - 写入文件以创建 JAR 时出现 NullPointerException

java - 根据某些条件更改 where 子句标准

Java - 扩展一个类并重用这些方法?

java - Java中Windows文件数字签名的属性

c - 在 C 中获得无限输入?

java - 如何在仅给出 jar 文件名的情况下获取 jar 文件在类路径中的绝对路径?

java - Eclipse - 将所需的库提取/打包到同一个 Runnable JAR 中