0

ローカル ファイルから Excel シートを取得し、計算のためにプログラムに指定された値をアップロードするプログラムを Java で作成しています。Eclipse 内でコンパイルすると、すべて想定どおりに動作しますが、実行可能な jar ファイルを作成すると、「Java 例外が発生しました」というポップアップ エラーが表示されます。コードを調べて、メソッドを削除してスプレッドシートから値をロードすると、実行可能な 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>
4

2 に答える 2

0

何が問題なのかを理解するには、実際に例外を確認する必要があります。jar ファイルをダブルクリックするだけで、"javaw.exe" を使用して起動されます。これにはコンソールがないため、スタック トレースなしで例外が発生したことのみが報告されます。

代わりに、コマンド プロンプトを起動し、jar ファイルがある場所に "cd" します。次に、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 パスのリストで、間にスペースはありません)。

于 2013-08-06T21:11:58.120 に答える
0

コマンドラインから実行するのではなく、jarファイルをダブルクリックして実行可能にするにはどうすればよいですか?」(コメントで返信しようとしましたが、サイズ制限が小さすぎました。)

Eclipse では、プロジェクトが正しく実行されている「実行構成」を取得したら、次のようにします。

  • プロジェクトを右クリック -> エクスポート... -> (Java から) -> 実行可能な JAR ファイル
  • ドロップダウン リストから、プロジェクトを起動する実行構成を選択します。
  • [エクスポート先] で、実行可能な jar をエクスポートする場所を参照し、jar ファイル名を選択します。
  • 「ライブラリの処理」の下で、「必要なライブラリを生成された JAR にパッケージ化する」を選択します。
  • 終了

jar ファイルは正常に実行されるはずです。デフォルトでは「javaw」で開き、コンソールが表示されないことに注意してください。出力を確認するためにコンソールが必要な場合、またはコンソールが失敗して例外を確認したい場合は、jar があるコンソールを開き、"java -jar MyJarName.jar" を実行します (メイン クラスと依存関係を指定する必要はもうありません)。 )。

于 2013-08-13T18:24:25.367 に答える