32位应用程序在Eclipse中运行,但在部署之后不能运行。 (没有错误..)

时间:2015-11-27 19:40:01

标签: java apache-poi

我需要帮助。我正在使用e(fx)clipse在Eclipse中编写Java FX应用程序。我正在使用它的通用build.fxbuild来生成开发我的.EXE文件所需的ant脚本。

该应用程序在Eclipse IDE中完美运行。当使用64位JDK打包时,它甚至可以在部署为.EXE后完美运行。

当我使用32位JDK打包32位安装时出现问题。使用32位JDK,它仍然可以在Eclipse中完美运行。当我创建.EXE时,看似运行正常。问题是......软件使用excel的地址文件,将它们与地址的sql数据库进行比较,然后在SQL数据库中附加带有“ID”建议的excel文件,为客户提供服务我们的数据库中可能存在哪个地址(来自excel)的引用。软件唯一没做的就是附加功能。但是,它会创建XSSFWorkbook,并重新保存工作簿并打开它。所以它得到了这个细分的开始代码,以及结束。但是32位和64位中间正在发生一些事情。

需要帮助!

public static void writeMatchedRecords(XSSFWorkbook wb, HashMap<Integer, ExcelAddress> excelRecords,
        HeaderTemplate template) {

    if (Defaults.DEBUG) {
        System.out.println("Writing " + excelRecords.size() + " excel records");
    }

    // Variable to allow writing to excel file
    CreationHelper createHelper = wb.getCreationHelper();

    // Iterate through every row of the excel sheet
    for (Row row : wb.getSheetAt(0)) {

        if (excelRecords.containsKey(row.getRowNum() + 1)) {

            ExcelAddress excelTemp = excelRecords.get(row.getRowNum() + 1);
            HashMap<Double, ArrayList<ShipTo>> matchedShipTos = excelTemp.getMatchedShipTos();

            if (Defaults.DEBUG) {
                System.out.print(row.getCell(template.getColName()) + " from Excel matches with " + excelTemp.getName() + " from HASH with " + matchedShipTos.size() + " matches.");
            }

            if (matchedShipTos.isEmpty() == false) {

                if (Defaults.DEBUG) {
                    System.out.println(" (non-zero confirmed)");
                }

                // If Matched Ship contains 100% matches remove all other
                // matches
                if (matchedShipTos.containsKey(1d)) {
                    HashMap<Double, ArrayList<ShipTo>> tempHM = new HashMap<Double, ArrayList<ShipTo>>();
                    tempHM.put(1d, matchedShipTos.get(1d));
                    matchedShipTos.clear();
                    matchedShipTos.putAll(tempHM);
                }

                Map<Double, ArrayList<ShipTo>> sortedShipTos = new TreeMap<Double, ArrayList<ShipTo>>(matchedShipTos).descendingMap();                  

                for (Map.Entry<Double, ArrayList<ShipTo>> entry : sortedShipTos.entrySet()) {

                    for (ShipTo shipTo : entry.getValue()) {

                        if (Defaults.DEBUG) {
                            System.out.print("Ship to Match: ");
                            System.out.print(shipTo.getName());
                            System.out.print(" P: " + entry.getKey() + "\n");
                        }

                        if (row.getLastCellNum() == wb.getSheetAt(0).getRow(0).getLastCellNum()) {
                            // Create additional headers
                            wb.getSheetAt(0).getRow(0).createCell(row.getLastCellNum())
                                    .setCellValue(createHelper.createRichTextString("Probability"));
                            wb.getSheetAt(0).getRow(0).createCell(row.getLastCellNum() + 1)
                                    .setCellValue(createHelper.createRichTextString("P21 - Ship to ID"));
                            wb.getSheetAt(0).getRow(0).createCell(row.getLastCellNum() + 2)
                                    .setCellValue(createHelper.createRichTextString("P21 - Ship to Name"));
                            wb.getSheetAt(0).getRow(0).createCell(row.getLastCellNum() + 3).setCellValue(
                                    createHelper.createRichTextString("P21 - Ship to Address Line 1"));
                        }

                        row.createCell(row.getLastCellNum()).setCellValue(entry.getKey());
                        row.createCell(row.getLastCellNum())
                                .setCellValue(createHelper.createRichTextString(Integer.toString(shipTo.getId())));
                        row.createCell(row.getLastCellNum())
                                .setCellValue(createHelper.createRichTextString(shipTo.getName()));
                        row.createCell(row.getLastCellNum())
                                .setCellValue(createHelper.createRichTextString(shipTo.getAddress1()));

                    }

                }

            }
        }
    }

    Date date = new Date();
    int rand = (int) (Math.random() * 10);
    File file = new File(System.getProperty("user.home") + "/Desktop/"
            + String.format("%1$s %2$tF%3$s", template.getTemplateName(), date, " (" + rand + ").xlsx"));

    try

    {
        FileOutputStream fileout = new FileOutputStream(file);
        wb.write(fileout);
        fileout.close();
        Desktop.getDesktop().open(file);
    } catch (

    Exception e)

    {
        Alert alert = new Alert(AlertType.ERROR);
        alert.setTitle("Error");
        alert.setHeaderText("Could not save data");
        alert.setContentText("Could not save data to file:\n" + file.getPath());

        alert.showAndWait();
    }

}

1 个答案:

答案 0 :(得分:2)

我遇到了与SWT类似的问题

一般问题是当你需要一些依赖于特定jar的本机函数(如屏幕系统)时。

关于FX的相关讨论:

Creating 32 bit JavaFx Native Bundle in 64 bit machine

https://github.com/javafx-maven-plugin/javafx-maven-plugin/issues/81

Does JavaFX work in 32-bit Windows? (or with a 32-bit JVM)?

我的方式:

1找到JAR

Finding javafx jar file for windows

2在你的app中登上2个罐子

运行时

3,检查32/64

Properties prop=java.lang.System.getProperties();
String 32_64=prop.getProperty("sun.arch.data.model");
// => 32 or 64

4加载&#34;好&#34; jar在运行时(检查之前已加载)

How should I load Jars dynamically at runtime?