我在java中编写一个程序,它从本地文件中获取excel表,并将给定的值上传到程序中进行一些计算。当我在eclipse中编译时,一切都按预期工作,但是当我创建一个可运行的jar文件时,我得到一个弹出错误“发生Java异常”。我仔细检查了代码,如果我删除了从电子表格中加载值的方法,那么runnable jar就可以了。但是,如果我重新放入代码来加载值,它就会中断。这段代码中发生了什么导致整个程序崩溃?
private static void loadValues() throws IOException{
//FileInputStream file = new FileInputStream(new File("src/PricingData.xls"));
FileInputStream file = new FileInputStream(new File("F:/Sales/Stitt/PricingData.xls"));
HSSFWorkbook wb = new HSSFWorkbook(file);
HSSFSheet sheet = wb.getSheetAt(0);
Cell cell = sheet.getRow(1).getCell(1);
MLPPSF = cell.getNumericCellValue();
cell = sheet.getRow(2).getCell(1);
COPPSF = cell.getNumericCellValue();
cell = sheet.getRow(3).getCell(1);
GPPSF = cell.getNumericCellValue();
cell = sheet.getRow(4).getCell(1);
UPFINISHED = cell.getNumericCellValue();
cell = sheet.getRow(5).getCell(1);
LOWFINISHED = cell.getNumericCellValue();
cell = sheet.getRow(6).getCell(1);
DPPSF = cell.getNumericCellValue();
cell = sheet.getRow(8).getCell(1);
onePanelWaterHeater = cell.getNumericCellValue();
cell = sheet.getRow(9).getCell(1);
twoPanelWaterHeater = cell.getNumericCellValue();
cell = sheet.getRow(10).getCell(1);
saferoomCost = cell.getNumericCellValue();
cell = sheet.getRow(11).getCell(1);
solarPVCost = cell.getNumericCellValue();
cell = sheet.getRow(12).getCell(1);
metlundCost = cell.getNumericCellValue();
cell = sheet.getRow(13).getCell(1);
ervCost = cell.getNumericCellValue();
cell = sheet.getRow(14).getCell(1);
gasFireplaceCost = cell.getNumericCellValue();
cell = sheet.getRow(15).getCell(1);
woodFireplaceCost = cell.getNumericCellValue();
cell = sheet.getRow(18).getCell(1);
allCabVanPercent = cell.getNumericCellValue();
cell = sheet.getRow(19).getCell(1);
allAppliancePercent = cell.getNumericCellValue();
cell = sheet.getRow(20).getCell(1);
allLightFixPercent = cell.getNumericCellValue();
cell = sheet.getRow(21).getCell(1);
allPlumbFixPercent = cell.getNumericCellValue();
cell = sheet.getRow(22).getCell(1);
allFloorCoveringPercent = cell.getNumericCellValue();
cell = sheet.getRow(25).getCell(1);
DepositPercent = cell.getNumericCellValue();
cell = sheet.getRow(26).getCell(1);
Draw1Percent = cell.getNumericCellValue();
cell = sheet.getRow(27).getCell(1);
Draw2Percent = cell.getNumericCellValue();
cell = sheet.getRow(28).getCell(1);
Draw3Percent = cell.getNumericCellValue();
cell = sheet.getRow(29).getCell(1);
Draw4Percent = cell.getNumericCellValue();
cell = sheet.getRow(30).getCell(1);
Draw5Percent = cell.getNumericCellValue();
cell = sheet.getRow(31).getCell(1);
Draw6Percent = cell.getNumericCellValue();
cell = sheet.getRow(32).getCell(1);
Draw7Percent = cell.getNumericCellValue();
cell = sheet.getRow(33).getCell(1);
Draw8Percent = cell.getNumericCellValue();
cell = sheet.getRow(34).getCell(1);
Draw9Percent = cell.getNumericCellValue();
}
主要是:
public static void main(String[] args) {
// TODO Auto-generated method stub
initialize();
try {
loadValues();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
showGUI();
}
编辑:
通过命令行运行时出现错误。
C:\Documents and Settings\Conference Room\SESI>java -jar SESI.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/ss/use
rmodel/Cell
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.Cell
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 6 more
C:\Documents and Settings\Conference Room\SESI>
答案 0 :(得分:0)
要弄清楚什么是错的,你需要实际看到异常。只需双击jar文件就可以使用“javaw.exe”启动它,它没有控制台,因此只报告存在异常 - 没有堆栈跟踪。
相反,启动命令提示符并“cd”到jar文件所在的位置。然后,假设jar名称是“MyJarFile.jar”,运行:
java -jar MyJarFile.jar
当使用“java.exe”运行时,printStackTrace()实际上会有一个控制台,用于打印堆栈跟踪,这将指向有问题的代码行并说明问题的类型。
更新(在发布的例外之后):
啊,既然你需要第三方依赖,你需要切换到这样的东西,显式运行你的主类并指定一个包含所有必需类的类路径:
java -cp path\to\ApachePoiJarName.jar;path\to\MyAppJarFile.jar my.main.class.package.MyMainClass
...用“path \ to”,“ApachePoiJarName”,“MyAppJarFile”,“my.main.class.package”和“MyMainClass”替换为相应的名称。
如果POI jar依次需要它自己的依赖项,那么也将这些文件的路径添加到类路径中(由分号分隔的jar路径列表,它们之间没有空格)。
答案 1 :(得分:0)
回复“现在我需要做什么才能通过双击jar文件使其运行,而不是从命令行运行它?”(试图回复评论但是尺寸限制太小。)
在Eclipse中,一旦你有一个“运行配置”项目正确运行:
您的jar文件现在应该正常运行。请注意,它默认打开“javaw”,不显示控制台。如果你需要一个控制台来查看一些输出,或者如果它失败并且你想看到异常,打开一个jar所在的控制台并运行“java -jar MyJarName.jar”(不再需要指定主类和依赖项) )。