- PR -

iReportでコンパイルエラー

1
投稿者投稿内容
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2003-11-13 11:58
使用環境
 WindowsXP Professional
 Java1.4.1_02 (X:\usr\bin\jdk)
 ant1.5.2 (X:\usr\bin\ant-1.5.2)
 iReport0.2.2 (X:\iReport)


iReport上で編集を行ったファイルを保存してコンパイルすると、
出力ウインドウにエラーメッセージが出力され、コンパイルが正
常にできなくて困ってます。次のメッセージは、レポートウィザー
ドでクラシックスタイルのレイアウトを作り、ファイルをX:\tmp\test.xml
として保存した物をコンパイルした際のメッセージの抜粋です。

メッセージ
------------------------------------------------------
Compiling to file... X:\tmp\test.jasper -> X:\iReport\classic.java Errors compiling X:\tmp\test.jasper! Warning : Element bottom reaches outside band area : y=0 height=1 band-height=0
java.io.IOException: CreateProcess: javac -classpath X:\iReport;X:\iReport\classes;(長々とクラスパスが続きます)X:\iReport\classic.java error=2
 at java.lang.Win32Process.create(Native Method)
 at java.lang.Win32Process.<init>(Win32Process.java:63)
 at java.lang.Runtime.execInternal(Native Method)
   .
   .
   .
ESTED BY :
dori.jasper.engine.JRException: Error compiling report java source file : X:\iReport\classic.java
 at dori.jasper.engine.design.JRJavacCompiler.compileClass(JRJavacCompiler.java:127)
 at dori.jasper.engine.design.JRAbstractJavaCompiler.compileReport(JRAbstractJavaCompiler.java:151)
 at dori.jasper.engine.design.JRDefaultCompiler.compileReport(JRDefaultCompiler.java:136)
 at dori.jasper.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:135)
 at dori.jasper.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:123)
 at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:139)
 at java.lang.Thread.run(Thread.java:536)
Caused by: java.io.IOException: CreateProcess: javac -classpath X:\iReport;X:\iReport\classes;(長々とクラスパスが続きます) X:\iReport\classic.java error=2
   .
   .
   .
------------------------------------------------------

java.io.IOExceptionが出ていたので必要なファイルが見つからない
のかなーと思ったのですが、試しにコンパイルを手動で行ってみました。
javacの部分をクリップボードにコピーし、javacにパスが通った状態のコ
マンドラインにペーストして実行したのですが、
------------------------------------------------------
指定されたパスが見つかりません。
------------------------------------------------------
とメッセージが出ました。エディタにペーストして色々試したところ、
javac -clapass などのセパレータとなっているスペース部分の文字コー
ドがユニコード絡みのせいか、おかしな文字コードになっていたので半
角スペースを削除して打ち直したところ、無事コンパイルが通りました。
もしかしたらiReportが生成するコンパイル用のコマンドの文字コードが
原因なのかもしれないと思ったのですが、対処法などを方々探しても
見つけることができず、こちらで質問させていただくこととなりました。
雑誌でiReportの記事などを見ても特別な注意点なども無いのです
が、Antのマイナーバージョンと動作確認しているOSがWindowsXPで
あることが異なります。
長々とした文章で申し訳ないのですが、どなたか同じようなトラブルに
遭っている方とかいらっしゃいませんか?。
お知恵を拝借!。 m(_ _)m


[ メッセージ編集済み 編集者: 小僧 編集日時 2003-11-13 12:01 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-11-13 12:19
IOException といってもファイルがみつからないわけではなさそうです。

スタックトレースより Runtime.exec() でプロセスを起動するのに失敗しているようですね。
http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Runtime.html#exec(java.lang.String[])

iReport ってのは知らないのですが、PATH 環境変数の設定が間違っているとか、OS のリソースが足りなくてプロセスが起動できなくなっているとかではないでしょうか。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2003-11-13 13:28
javacのプロセス起動に失敗してるんですね、なるほど。
環境変数の設定ミスも見てみたのですが、問題は無いよ
うに思いました。バッチファイルの中身はこれです。
iReport.bat
-----------------------------------
@echo off

set JAVA_HOME=X:\usr\bin\jdk
set ANT_HOME=X:\usr\bin\ant-1.5.2
set IREPORT_HOME=X:\iReport

rem %ANT_HOME%\bin\ant javadocs
%ANT_HOME%\bin\ant iReport
-----------------------------------

メモリなどのリソース不足が出るような構成の
ハード環境では無いです。うーん、何なんだろう?。
raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2003-11-13 14:45
"error = 2"
ってことはENOENTですよね。
つまりリソース不足とかではなく,単にファイルが見つからないようです。

javacコマンドなのでファイルは存在するとして,
PATHが通っていないと考えるのが自然でしょう。
(1)PATH環境変数を見直す
(2)バッチファイルに下記を追加する
set PATH=%JAVA_HOME%\bin;%PATH%
(3)Runtime.exec()にフルパスで指定する
あたりが対策として考えられます。

それでもダメなら(ちょっと考えにくいですが),
Runtime.exec(String[])で,String配列の要素の分け方が
おかしい可能性もなくはないかな。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2003-11-13 15:56
解決いたしました。jdk\binがPATHに設定されていなかったのが
原因でした。Eclipseを使う環境になってから、コマンドラインで
javacを実行することが無くなってしまったせいで新しい環境に
設定を入れてませんでした。お恥ずかしいかぎりで...(^^;)
インギさん、raccoonさんどうもありがとうございました。

さて、ついでの質問なのですが、

> "error = 2"
>ってことはENOENTですよね。
>つまりリソース不足とかではなく,単にファイルが見つからないようです。

このリターンコード(エラーコード?)の意味することは、APIのドキュメ
ントとかに載っているのでしょうか?。



[ メッセージ編集済み 編集者: 小僧 編集日時 2003-11-13 15:55 ]

[ メッセージ編集済み 編集者: 小僧 編集日時 2003-11-13 15:57 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-11-13 16:13
私の環境で存在しえないプロセスを実行するよう試みたら以下のようになりました。

public class Test {
public static void main(String[] args) throws Exception{
Runtime.getRuntime().exec(new String[]{"foo","bar"});
}
}

>java Test
java.io.IOException: CreateProcess: foo bar error=2
at java.lang.Win32Process.create(Native Method)
at java.lang.Win32Process.<init>(Win32Process.java:67)
at java.lang.Runtime.execInternal(Native Method)
at java.lang.Runtime.exec(Runtime.java:566)
at java.lang.Runtime.exec(Runtime.java:491)
at java.lang.Runtime.exec(Runtime.java:457)
at Test.main(Test.java:3)
Exception in thread "main"

というわけで racoon さんがご指摘している通り PATH の問題ですね。
raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2003-11-13 19:13
少なくともJavaとして決められてはいないと思います。
スタックトレースの一番上が
at java.lang.Win32Process.create(Native Method)
であることからも,このメッセージの内容は実装依存である
と考えられます。

わたしはUNIX+C言語の経験が長かったので,
「execでerrno=2といえば,ファイルがないかPATHが通っていない」
というのがほとんどパブロフの犬的にでてきちゃっただけなんです。

なぜならC言語では,エラー番号の2は(errno.hで定義されている)
"no such file or directory"の意味であり,
C言語のexec系システムコールでerrno=2が発生するのは,
典型的に「ファイルがないかPATHが通っていない」場合である
というのが,経験的に染み付いていたからです。

# いちおう,「JavaのRuntime.execでも内部ではC言語の
# fork&exec(またはそれ相当)の処理をしているはずで,
# そのエラー情報だろう」という推測くらいはしましたが。

# でも推測のわりにはかなり断定的な言い方でしたね。
# 間違ってなくてよかった・・・(^^;;
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2003-11-13 19:51
経験からの出典ですか、そりゃGoogleでも見つからないや! (^o^)
APIのRuntimeのexecやjavacのドキュメントも調べたんですが、
コードについての記述はありませんでした。いや助かった助かった。
というわけでiReportを使う場合は、付属してくるiReport.bat
(またはシェルスクリプト)で書かれている環境変数を設定に加え
、PATHにjdk\binが設定されている(またはする)必要があるという
ことでしたね。おかげさまで、JasperReportsのサンプルファイルを
いじって、PDFやらExcelやらHTMLで帳票を出力して使い方を研究
することができるようになりました。明日から早速、業務で使う帳票
を作ってみることにします。ありがとうございました。


1

スキルアップ/キャリアアップ(JOB@IT)