Java コンパイルNo.03316
安久津 さん 02/09/02 18:44
 
あくつです。

発言者 : kiki
件名 : hidesoft.4:03315| RE 03314 標準出力ウィンドウを一つに
日時 : 2002年09月02日 02:37
へのコメント。
書いているうちに、詳しい説明になりました。
後の検索に役立てるために、新規発言にしました。

● (0) 環境
秀丸 3.17 + WindowsME

>java -version
java version "1.3.1_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1_02-b02)
Java HotSpot(TM) Client VM (build 1.3.1_02-b02, mixed mode)

● (1) タグジャンプ使いましょ。
>仕様としては。
>--------------------------------------------------
>1.コンパイルの結果出力なので、毎回特定ウィンドウに
>  でること。
>  #よって、ウィンドウの確認は必要ないし、上書きで
>   上等です。
>2.テンポラリファイルへ出力した内容で、ウィンドウを
>  更新すること。
>3.今回のメイン。コンソールウィンドウを複数上げたく
>  ない。
>--------------------------------------------------
-- 省略 --
>//出力ファイル名
>$file = "C:\\Temp\\Compile.con";
>
>// javacの実行(ここは、なんでもありですね。)
>run "javac filename > " + $file;

これだと $file から、タグジャンプができなくなります。(^^;)
秀丸標準では、タグジャンプは F10キー に割り当てられています。
javac のエラー出力行(ファイル名のある所)にカーソルを置いて、
 F10 キーを押すと、エラーや警告のある行にジャンプできます。

● (2) javac のリダイレクト。
>あとは、標準出力もフックできれば・・・。
>うお! " 2> "でええんだ!!!

Windows95,98,ME ではできません。
通常は次のオプションを使います。

javac -J-Djavac.pipe.output=true MyClass.java >err.log

ただし、一部の JDK( Java2 SDK 1.3 build 1.3.0-C あたり )の
javac にはバグがあってダメです。以下は対処法です。# 変でしょ

start javac -J-Djavac.pipe.output=true MyClass.java >err.log

● (3) 秀丸で標準エラー出力取得。
>環境としては、Win2000+秀丸V3.17で確認しています。
>多分、環境依存の部分はないと思うのですが・・・。
>どうかな。

昔、Win9x の秀丸は、標準エラー出力を
run (プログラム実行(X)...)の '>con' で取得できませんでした。
# つーか、標準出力さえ得られない場合があった。
たとえば、Perl の正規表現のドキュメントを得ようとして、
秀丸の「プログラム実行(X)...」

perl -x -S perldoc perlre >con

としても何も得られませんでした。
#シェルが貧相なだけなんだけど。
# NT 系の人が作るマクロは考慮してくれないの。(;_;)

JDK1.0.2 時代、マクロで
run "javac %b >con";
が可能。

JDK1.1 以降そのマクロは動かなくなる。
んで、秀丸が標準エラー出力を取得できるようになると、
動かなかったマクロが動くようになる。 NT 系の人は知る由もない。

● (4) javac.mac サンプル。
最近 Java は使わないんですけど、
今なら以下 $$jc の中から選ぶと思います。

// javac.mac
$LOG = "javac.log"; $TMP = "javac.tmp";
if( rightstr(basename,5)!= ".java" ){ beep; endmacro; }

// -deprecation オプションをつけた方がいいです。
$$jc = "javac -J-Djavac.pipe.output=true " + basename2 + " > " + $TMP;
//$$jc = "javac " + basename2 + "  2> " + $TMP; // NT 系限定
//$$jc = "start javac -J-Djavac.pipe.output=true " + basename2 + " > " + $TMP;
//$$jc = "javac -Xstdout " + basename2 + " > " + $TMP; // JDK1.2 で可能。
run $$jc;
//runsync $$jc;
//runsync2 $$jc;
    if( ! result ){ message "コンパイル失敗。"; endmacro; }
    //$SRC = basename2;
    ##log = findhidemaru($LOG);
    if( ##log == -1 ){
        if( existfile($LOG) ){
            openfile $LOG;
        }else{
            newfile; insert "\n"; saveas $LOG;
        }
    }else{
        setactivehidemaru hidemaruhandle(##log);
    }
    gofileend;
    insert "\n---------------------------\n";
    insert "Date: " + date + " " + time + "\n";
    ##lineno = lineno;
    insertfile $TMP;
    // $LOG が空の場合もある。
    // ただし、$$jc の選択が間違っていて、$LOG が空の場合もある。
    // テスト中は、カレントディレクトリの $TMP が更新されているのか確認する。
    if( code != eof ){
        gofileend; // 描画の調整のため。
        movetolineno 1, ##lineno; // 直ぐ tagjump 可能。
    }else{
        insert "エラーも警告も無いです。\n";
    }
    save;
endmacro;

// 上記のマクロでは、パッケージを指定したソースはコンパイル不可。
// 自作マクロは bregexp.dll and bregif.dll で動作不能に陥った。(^^;)
// また Java 系マクロ書くかも。
// では。

[ ]
RE:03316 Java コンパイルNo.03317
kiki さん 02/09/03 23:22
 
お世話になります。

kikiです。
私のJDKは"1.3.1_03"で行っています。

※すみません。途中、いろいろ省略してしまいました。

>● (1) タグジャンプ使いましょ。

これ、賛成です。秀丸で開発している最大のメリットかも。
って、VCみたいになってきました。(^^)
現状、ファイル名を0カラム目からフルパスで指定出力されるように
していますので、使えていますが・・・。

>● (2) javac のリダイレクト。
>Windows95,98,ME ではできません。
>通常は次のオプションを使います。
>

と思ったのですが、コマンド > STDFILE 2> STDERRFILE
とリダイレクトすると、エラーになるのか、うまく動きま
せんでした。
中間ファイルへの書き込みにエラーが発生するようになり
ました。
やはり、標準エラーを標準出力へ出す必要がある様子ですね。

>● (3) 秀丸で標準エラー出力取得。
>としても何も得られませんでした。
>#シェルが貧相なだけなんだけど。
># NT 系の人が作るマクロは考慮してくれないの。(;_;)
>

先のように、Win2000でも結局ダメでした。
シェルといば、UNIX触ってからWin環境へ来ると辛いものが
ありますね。
Win2000やNTも、シェルっていえるのかなぁ・・・。疑問。

気分を害されると申し訳ないのですが、Win9x系で開発は
考えられません。
落ちるは、固まるは。本当にOSなのかと、不信感一杯です。
どうにか妥協してNT系です。

ただ、アプリはWinの方が好きです。操作性が統一されてい
る感じがして。(^^)

>
>● (4) javac.mac サンプル。
>// -deprecation オプションをつけた方がいいです。

ありがとうございます。
ぜひ付けさせていただきます。(^^)

>
>// 上記のマクロでは、パッケージを指定したソースはコンパイル不可。
>// 自作マクロは bregexp.dll and bregif.dll で動作不能に陥った。

パッケージについては、出力先を指定してあげているので、
問題ありません。
javacのオプションで、出力先として自分のclassファイルを
配置するパスを-dで指定します。

次はnmakeで対応したいと思ったのですが、カレントディレ
クトリをうまく指定できなくて・・・。
バッチファイルをキックしようかな。
あっ、いいてかも!明日やってみよ。

そうそう、nmakeにも標準エラー出力を標準出力へ出力する
オプションがありました。

以上です。

[ ]
RE:03316 Java コンパイルNo.03318
kiki さん 02/09/03 23:30
 

そうそう。

私のマクロの説明で、
run "javac filename > .......

って書いてしまったのですが、正しくは「filename2」を
使用しています。
※本当に<ファイル名>ってつもりで書いてしまいました。
 Javaは大文字・小文字を気にする必要がありました。

お騒がせいたしました。

[ ]
RE:03317 Java コンパイルNo.03319
安久津 さん 02/09/04 20:34
 
あくつです。

● (1)
>現状、ファイル名を0カラム目からフルパスで指定出力されるように
>していますので、使えていますが・・・。
えっ、そういうオプションがあるんですか・・・。

● (2)
>パッケージについては、出力先を指定してあげているので、
>問題ありません。
>javacのオプションで、出力先として自分のclassファイルを
>配置するパスを-dで指定します。
ガーン。
現在のディレクトリ( パッケージのルート )をそのまま指定できるんですね。
#知らんかった。いちいち移動していた。
#別なディレクトリに保存するためだけにあるんだと思っていた。(^^ )>>

● (3)
>次はnmakeで対応したいと思ったのですが、カレントディレ
>クトリをうまく指定できなくて・・・。
>バッチファイルをキックしようかな。
>あっ、いいてかも!明日やってみよ。
これって、パッケージのルートに相当するディレクトリを
カレントディレクトリにしたいっていうことですか。#ヾ(^^;)コダワッテル

● (4) 秀丸とカレントディレクトリ。
秀丸から run/runsync/runsync2 を実行するときは、
現在アクティブな秀丸が開いているファイルのあるディレクトリが
カレントディレクトリになります。
たとえば、
D:\lang\java\src\foo\bar\baz\MyApplet.java を開いている場合、
カレントディレクトリは
D:\lang\java\src\foo\bar\baz
です。

秀丸マクロからカレントディレクトリを操作したい場合、
わたしが知っている方法は3通りです。
  (A)バッチファイルを経由する。
  (B)田楽 DLL を使う。
  (C)移動したいディレクトリにあるファイルを開いてアクティブにする。

● (5) 実例。
    バッチで充分かも知れませんが、
    一応、選択肢として示しておきます。

(B)田楽 DLL を使う。
    田楽 DLL は、
    http://hidemaru.xaxon.co.jp/lib/macro/index.html
    からダウンロードできます。

    以下の例は、
    package foo.baz.bar; である
    D:\lang\java\src\foo\bar\baz\MyApplet.java
    のためのメイクファイル
    D:\lang\java\src\MyApplet.mak
    の実行例。

  $$pwd = "D:\\lang\\java\\src";
  $$d = hidemarudir + "\\dengakudll.dll";
  if( $$d != loaddllfile ){
  loaddll $$d;
  if( ! result ){ message "failed to load dengakudll.dll"; endmacro; }
  }
  if( ! dllfunc("SETCURDIR",$$pwd) ){ message "error"; endmacro; }
  run "nmake -f MyApplet.mak";
  // nmake もたぶん -f。

---------------
(C)移動したいディレクトリにあるファイルを開いてアクティブにする。

  ##src = hidemaruhandle(0);
  ##close = 0;
  $$mak = "D:\\lang\\java\\src\\MyApplet.mak";
  if( $$mak != filename2 ){
      ##mak = findhidemaru($$mak);
      if( ##mak == -1 ){
          if( existfile($$mak) ){
              openfile $$mak;
              // 目障りなら、ステルスモード( hidden mode )で開く。
              // openfile "/h " + $$mak;
              ##close = 1;
          }else{
              message $$mak + " が無い。"; endmacro;
          }
      }else{
          ##mak = hidemaruhandle(##mak);
          setactivehidemaru ##mak;
      }
  }
  run "nmake -f MyApplet.mak";
  setactivehidemaru ##src;
  if( ##close ){
     closehidemaruforced ##mak;
  }


● (6) パッケージから、移動したい場所を取得するサンプルマクロ。

    D:\lang\java\src\foo\bar\baz\MyClass.java
    というファイルに、
    package foo.bar.baz;
 が書いてある。

 この MyClass.java がアクティブなときに、
 以下のマクロを実行すると、
 D:\lang\java\src をカレントディレクトリにして、
 コマンドプロンプトが起動します。

// ------------------------------
    call get_package_root;
    $$cmd = "cmd.exe /k cd " + $DIR;
//  $$cmd = "command.com /k cd " + $DIR;
    run $$cmd;
endmacro;
get_package_root:
    escape; // 選択などの解除。
    disabledraw;  // 描画禁止。
    ##cx = x; ##cy = y; // 現在のカーソル位置保存。
    $PACKAGE = "";
    gofiletop;
    searchdown2 "^[ \\t]*package[ \\t]+[0-9A-Za-z_.]+[ \\t]*;", regular;
    if( result ){
    // パッケージがある場合。
        searchdown "kage"; escape; right 4;
        searchdown "[0-9A-Za-z_.]+", regular;
        $PACKAGE  = gettext( seltopx, seltopy, selendx, selendy );
        $$src = $PACKAGE + "." + basename2;
        ##len = strlen(filename2) - strlen($$src);
        $DIR = leftstr(filename2, ##len);
    }else{
    // パッケージが無い場合。
        $DIR = directory2;
        if( rightstr($DIR, 1) != "\\" ) $DIR = $DIR + "\\";
        // 必ず \ をつけておく。
    }
    escape;
    moveto ##cx, ##cy;
return $DIR;
// 秀丸の場合、田楽 DLL と組合わせると楽です。
//  call get_package_root;
//  if( ! dllfunc("SETCURDIR",$DIR) ){ message "error"; endmacro; }
//  run "nmake -f MyApplet.mak";
// では。

[ ]
RE:03319 Java コンパイルNo.03332
kiki さん 02/09/05 23:55
 
kikiです。
お世話になります。

>● (1)
(中略)
>えっ、そういうオプションがあるんですか・・・。
>

いえ、filename2でフルパスをjavacに渡しているだけです。
エラーが発生した場合、フルパスで出力されるので、タグジャンプ
については、問題無いです。

>● (2)
(中略)
>ガーン。
>現在のディレクトリ( パッケージのルート )をそのまま指定できるんですね。
>#知らんかった。いちいち移動していた。
>#別なディレクトリに保存するためだけにあるんだと思っていた。(^^ )>>
>

いろいろなパスでjavaファイルを作成して、カレントへclassファイル
を作成する場合には向きませんが、仕事として開発するときは、特定の
フォルダへclassファイルを出力するので、これで十分だと思います。

パッケージのフォルダも、javacが自動的に作ってくれますしね。

>● (3)
(中略)
>これって、パッケージのルートに相当するディレクトリを
>カレントディレクトリにしたいっていうことですか。#ヾ(^^;)コダワッテル
>

nmakeの利点は、カレントのフォルダにあるmakefileを常に処理対象と
することにあると思います。
すると、マクロの中にコンパイルの設定を書かずに、常に「nmake」って
やれば済みますから・・・。
あとは、カレントを変更するだけだと、安易に考えていたら痛い目にあ
いました。(^^;

>● (4) 秀丸とカレントディレクトリ。
(中略)
>秀丸マクロからカレントディレクトリを操作したい場合、
>わたしが知っている方法は3通りです。
>  (A)バッチファイルを経由する。
>  (B)田楽 DLL を使う。
>  (C)移動したいディレクトリにあるファイルを開いてアクティブにする。
>

run "cmd /c \"cd c:\\temp&&dir \" > " + $STDOUTFILE;

で、カレントの移動+コマンド実行が出来ました。
まあ、windows2000でですが・・・。

これで、nmakeコマンドを叩いてみます。
win9x系は、今手元にないので、実験していただけますか?
用は、複数コマンドの順次実行が、シェルに渡せればいい
と思います。

あとは、classとsrcのフォルダ指定を、makefileで行うだけ
です。

やはり実行カレントは、マクロ内に定義するのがベストかも
しれません。
そんなに、コロコロとフォルダを変えることは無いですし。

〜\dev\java\classes
〜\dev\java\src
と、classesとsrcフォルダの親を同じにして、開発用のROOT
パスとしています。
ここへ、makefileを置いて実行することにします。

結果は、また後日にご報告いたします。

以上です。

[ ]
RE:03332 Java コンパイルNo.03333
はてな さん 02/09/06 11:35
 
ちょっと、目にとまったので、
#秀丸の話じゃないので、ここに書いていいものかと思ったんですが。

私は、Javaのコンパイルするのに、ANTを使っています。
ANTは、Javaで書かれているためにどのプラットフォームでも
動くという利点があるために使っています。

詳しくは、
http://www.ingrid.org/jajakarta/ant/

[ ]
RE:03333 Java コンパイルNo.03336
kiki さん 02/09/06 15:19
 
kikiです。
いつもお世話になります。

>私は、Javaのコンパイルするのに、ANTを使っています。
>ANTは、Javaで書かれているためにどのプラットフォームでも
>動くという利点があるために使っています。
>

情報、ありがとうございます。
面白そうですね。

#目的と手段を明確にせねば・・・。(^^;

[ ]
RE:03332 Java コンパイルNo.03338
安久津 さん 02/09/06 21:29
 
あくつです。

>お世話になります。
こちらこそ。

● (1) カレントディレクトリついて。
>run "cmd /c \"cd c:\\temp&&dir \" > " + $STDOUTFILE;
>
>で、カレントの移動+コマンド実行が出来ました。
>まあ、windows2000でですが・・・。
>
>これで、nmakeコマンドを叩いてみます。
>win9x系は、今手元にないので、実験していただけますか?
>用は、複数コマンドの順次実行が、シェルに渡せればいい
>と思います。
ガーン。#そればっかり。
Win9x 系では、無理です。
通常は複数コマンドは実行できません。

C:\cygwin\home\ta>cd
C:\cygwin\home\ta

C:\cygwin\home\ta>cd c:\cygwin\home&&dir
ディレクトリの指定が正しくありません.

C:\cygwin\home\ta>cd c:\cygwin\home && dir
パラメータが多すぎます. - &&

C:\cygwin\home\ta>exit

---------------
 cygwin を経由すればできますが。# Win9x じゃないな (^^;)

C:\cygwin\home\ta>cygwin         #<-login用バッチ。
$ pwd
/home/ta
$ cd ..&&ls
a.mac.gz  ad/  ta/
$ cd ~
$ cd ..; ls
a.mac.gz  ad/  ta/
$ exit

// Win9x 系の人々向け情報。秀丸から(cygwin)複数コマンド実行例。
// RCS でファイルをチェックイン。
$$mes = "ややこしい";
$$bash = "c:\\cygwin\\bin\\bash --login -c ";
$$cmd = "cd `cygpath -u '" + directory3 + "'`; ci -m'" + $$mes + "' -l " +
        basename2 + " >&a.tmp";
run $$bash + "\"" + $$cmd + "\"";
openfile "a.tmp";
// NT 系に移植された RCS は WinME で動かない。

● (2)Makefile のある場所。

>〜\dev\java\classes
>〜\dev\java\src
>と、classesとsrcフォルダの親を同じにして、開発用のROOT
>パスとしています。
>ここへ、makefileを置いて実行することにします。

もともと
>2002年09月01日 05:22
>hidesoft.4:03310| 標準出力ウィンドウを一つに
以下のコメントツリーで話されていた内容を読んで、
run 実行時のカレントディレクトリが心配になりました。

しかし、これは Win9x 系特有の心配でした。(^^ )>>
# Win9x系の人には情報を提供できたかも知れませんが。

では。

● 蛇足。
そういえば、「タグジャンプできるできない」の話で、
「javac への引数にソースのフルパスを与えている」
っということでさえ、ちょっと(自分に)驚きました。
Win95 を使っていた時ですが、引数が長くなると、
けたたましく「ピーーー」とか音が鳴ります。
んで、oldapi 何某が死んで、シャットダウンできなくなります。
ctrl + alt + del も効かなくなり、リセットボタンが無いので、
直に電源を切ります。マジです。

run "\"c:\\program\\ files\\another\\bin\\javac\" " +
    "-deprecation -J-Djavac.pipe.output=true " +
    "foo\\bar\\baz\\MyClass.java > C:\\Temp\\a.tmp";

可能性としては色々ありますが。
無意識に引数を短くしようと努めていました。「Win95後遺症」
# WinME になってからは「ピーーー」は聞いていません。

[ ]
RE:03332 Java コンパイルNo.03339
でるもんた さん 02/09/06 21:37
 
> run "cmd /c \"cd c:\\temp&&dir \" > " + $STDOUTFILE;
>
> で、カレントの移動+コマンド実行が出来ました。
> まあ、windows2000でですが・・・。
>
> これで、nmakeコマンドを叩いてみます。
> win9x系は、今手元にないので、実験していただけますか?
> 用は、複数コマンドの順次実行が、シェルに渡せればいい
> と思います。

Win9x 系には cmd.exe がないので、別途入れる必要がありますね。こことか↓
http://www.neuro.gatech.edu/users/cwilson/cygutils/consize/index.html

[ ]
RE:03332 Java コンパイルNo.03343
ひろ さん 02/09/07 12:26
 
 安久津さん、kiki さん今日は、ひろです。
> >秀丸マクロからカレントディレクトリを操作したい場合、
> >わたしが知っている方法は3通りです。
> >  (A)バッチファイルを経由する。
> >  (B)田楽 DLL を使う。
> >  (C)移動したいディレクトリにあるファイルを開いてアクティブにする。
> >
>
> run "cmd /c \"cd c:\\temp&&dir \" > " + $STDOUTFILE;
>
> で、カレントの移動+コマンド実行が出来ました。
> まあ、windows2000でですが・・・。
 この (A), (B), (C) 以外に changename を使って、一時的に別ディレクト
リのファイルのふりをさせることが出来ます。
//------------------------------------------------------------
$file = filename2;
changename "c:\\temp\\tmp.txt";
run "command.com /c dir > con";
changename $file;
clearupdated;

[ ]
RE:03343 Java コンパイルNo.03357
安久津 さん 02/09/08 17:44
 
あくつです。

● (1)
>$file = filename2;
>changename "c:\\temp\\tmp.txt";
>run "command.com /c dir > con";
>changename $file;
>clearupdated;
ガーン。#まただよ。
ずいぶん簡潔で。(^^;)

では。

[ ]