- PR -

APサーバへデプロイする際のソースのコンパイルについて

投稿者投稿内容
Hiro
会議室デビュー日: 2004/01/06
投稿数: 3
投稿日時: 2004-01-07 11:29
初めまして、Hiroと申します。
初めて投稿させていただきます。
どうぞ宜しくお願い致します。

件名について内容を補足しますと、
開発機で作成した最新の全ソースファイルを、
対象となるAPサーバへデプロイする前の段階で、
一括してコンパイルし直したいと考えており、その際の質問です。

<<環境>>
開発機
 OS:Windows 2000 Professional
 開発ツール:WebSphere Studio(Site Developer 5.1)
 JDKバージョン:1.3(開発ツールに附属のもの)
APサーバ
 OS:RedHat Enterprise Linux ES(2.1)
 Webサーバ:WebSphere Application Server 5.0(J2EE1.3準拠)
 JDKバージョン:1.3(Webサーバに附属のもの)


具体的な質問を以下に挙げます。

Q1.JDKはサンが公開しているものや、
ソフトウェアベンダが独自に提供しているものがあるかと思いますが、
同じJDK1.3でも互換性については完全ではないのでしょうか?

もし完全ではない、又は好ましくないといった場合には、
開発機で作成したソースをコンパイルする際には、
APサーバと同一のJDKを用いてコンパイルしないと問題ということになりますか?
(j2ee.jarなど完全にAPサーバ依存のものに関しては、そちらのクラスパスを通してます)

Q2.一応、サンのJDKと開発ツールのJDKを用いた場合における
APサーバへのデプロイ&動作検証はどちらも正常動作が確認できました。
その際、Antを用いてコンパイル・アーカイブの作成などをバッチ化してます。
その中で、JDKの選択、クラスパスへのライブラリの追加などを行い、
恐らく開発ツールであるWebSphere Studioと同じ設定にしたはずなんですが、
(結果からすると、どこか違うか抜けているんでしょうが)
開発ツールからコンパイルしたクラスファイルと、
バッチからコンパイルしたクラスファイルのサイズが異なります。
(バッチでは、JDKの違いによるサイズの違いはありませんでした)

それでも、開発ツールからでもバッチからでもAPサーバでの動作確認ができましたが、
このクラスファイルのサイズが異なるというのはどういう意味なのでしょうか?
Q1に関する回答に関連するものと思いますが、どれが信頼にたるものかが分かりません。

※そもそもソフトウェアのライセンス的には、
コンパイル専用の開発機にWebSphere Studioを入れて、
そこで最終的なコンパイルをすれば問題はないかもしれませんが、
わざわざ開発ツールを起動し、ソースを最新にした後コンパイルするのが手間になるのと、
開発ツールに頼ったコンパイルでは、その他の場面で応用が利かないためです。


質問内容がもしかしたら根本的・初歩的なことかもしれませんが、
(Javaの仕組みをきちんと理解してないための問題など)
今回きっちり勉強したいと思いますので、
ご指導いただけましたら、宜しくお願い致します。

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-01-07 12:15
unibon です。こんにちわ。

引用:

Hiroさんの書き込み (2004-01-07 11:29) より:
Q1.JDKはサンが公開しているものや、
ソフトウェアベンダが独自に提供しているものがあるかと思いますが、
同じJDK1.3でも互換性については完全ではないのでしょうか?


"Write Once, Run Anywhere." なので大丈夫です。と言うのは冗談ですが(冗談なのか)、コンパイラのレベルでの互換性は、通常は気にしなくても良いです。わずかなコンパイラの非互換性やバグを気にするよりも、アプリケーションのバグやランタイムライブラリのバグを気にしたほうが良いでしょう。
ただし、もっとも、javac での -target オプションに相当する、クラスファイルのバージョン指定は正しく指定する必要があります。
一方で、とくに、ランタイムライブラリの互換性には注意されたほうが良いでしょう。原則としては上位互換性は保たれますが、下位互換性は保たれません。上位のバージョンに付属するライブラリ(に含まれるクラスやその中のメソッド)を使ってコンパイルしたクラスファイルを、それよりも下位のバージョンの環境で動かすと、NoSuchMethodError や NoClassDefFoundError が出ることがあります。したがって、コンパイラは何でも良いのですが、コンパイル時に使うライブラリの指定には注意しなければなりません。
これらについては以前に、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3770&forum=12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7061&forum=12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8363&forum=12
のスレッドに書いたことがあります。

引用:

Hiroさんの書き込み (2004-01-07 11:29) より:
Q2.一応、サンのJDKと開発ツールのJDKを用いた場合における
APサーバへのデプロイ&動作検証はどちらも正常動作が確認できました。
その際、Antを用いてコンパイル・アーカイブの作成などをバッチ化してます。
その中で、JDKの選択、クラスパスへのライブラリの追加などを行い、
恐らく開発ツールであるWebSphere Studioと同じ設定にしたはずなんですが、
(結果からすると、どこか違うか抜けているんでしょうが)
開発ツールからコンパイルしたクラスファイルと、
バッチからコンパイルしたクラスファイルのサイズが異なります。
(バッチでは、JDKの違いによるサイズの違いはありませんでした)


Eclipse だとコンパイラは独自のものを持っているようであり、おそらく WebSphere Studio もこれと同様だと思います。クラスファイルのサイズが違うのは、コンパイラに委ねられた実装の違いによるものであり、互換性がないためではないはずです。心配ならば javap で解析されて、コンパイラに委ねられた実装による違いを超えるような大きな違いがないことを確認されると良いでしょう。
Hiro
会議室デビュー日: 2004/01/06
投稿数: 3
投稿日時: 2004-01-07 13:29
こんにちは、質問をしておりましたHiroです。

unibonさん、早速のお返事有難うございます。

まだ、javacのtargetオプションや、
javapコマンドによる実行結果は確認できておりませんが、(後ほど確認してみます)
コンパイラ・ランタイムライブラリに関する互換性についての考え方など大変参考になりました。

APサーバへデプロイするためのアーカイブの作成作業は、
一貫したコンパイル環境で行い、(決めうちした単一のJDK)
最終的な動作確認として、APサーバ上でのテストに重点を置いて行いたいと思います。

もやもやしていた点がだいぶ解消されました。
お忙しいところ、アドバイス有難うございます。

おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-01-07 13:33
引用:

Eclipse だとコンパイラは独自のものを持っているようであり、おそらく WebSphere Studio もこれと同様だと思います。


ここだけ反応します。
Eclipseでは独自のインクリメンタルコンパイラを使っているようです。
これが生成したクラスファイルをそのまま本番環境で実行するのではなく、
一度本番環境上でコンパイルしなおす方が良いと思います。

LinuxであればSunのJDKを使われているのだと思いますが、わざわざ開発機上で
SunのJDKでコンパイルし直す必要は無いと思いますよ。
Hiro
会議室デビュー日: 2004/01/06
投稿数: 3
投稿日時: 2004-01-07 14:56
こんにちは、Hiroです。

引用:

ここだけ反応します。
Eclipseでは独自のインクリメンタルコンパイラを使っているようです。
これが生成したクラスファイルをそのまま本番環境で実行するのではなく、
一度本番環境上でコンパイルしなおす方が良いと思います。

LinuxであればSunのJDKを使われているのだと思いますが、わざわざ開発機上で
SunのJDKでコンパイルし直す必要は無いと思いますよ。




Weblogicではセットアップ時にSunのJDKをインストール・設定しましたが、
WebSphereはソフトウェア内部にJDKを持っているみたいです。
そこにパスを通してあげれば、サーバ側でもコンパイルできるかもしれないですね。

一般的には、開発機側(又はWindowsプラットフォーム)でなくて、
本番機側(又はLinux/Unixプラットフォーム)でコンパイルしてデプロイするケースが多いのでしょうか?
(一般的というと語弊があるかと思いますが、皆さんの体験やお聞きする範囲という意味ですね)

私自身の経験や知識が乏しいため、参考にお聞きしたいです。
両者において大きなメリット・デメリットってあるんでしょうか?
(Windowsで管理する方が、他のプラットフォームに慣れてない場合には使いやすい、
本番機でコンパイルした方が信頼性が高いなど)

おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-01-07 17:05
引用:

Weblogicではセットアップ時にSunのJDKをインストール・設定しましたが、
WebSphereはソフトウェア内部にJDKを持っているみたいです。


バンドルされているのでしょうね。
IBMはSunとは別に独自のJVM実装を持っていますから。

このようなことをやる背景には、クラスファイルの互換性の問題があります。
具体的には、違うバージョンのJDKで作られたクラスファイルには互換性が無い
場合があり、実行時にエラーが出てしまうということもあるためです。
これを避けるために実行環境で再コンパイルします。

ちなみに、私は開発環境がWindows XP Professionalで、実行環境がhp-ux 11iのの時に
これを経験しました。hp-uxのJDKはSunのJDKをライセンスしてhpが独自に実装(移植?)
したものなので、このようなことが起きるのです。なぜなら、SunのJDKとhpのJDKでは
同じバージョンが付いていてもその中身が異なるからです。例えば、hpのJDKでは
バージョン1.2.2からHotSpotがサポートされていたりします。

私はこんなところですかね。

[ メッセージ編集済み 編集者: おばけ 編集日時 2004-01-07 17:08 ]
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2004-01-07 17:29
引用:

Weblogicではセットアップ時にSunのJDKをインストール・設定しましたが、
WebSphereはソフトウェア内部にJDKを持っているみたいです。
そこにパスを通してあげれば、サーバ側でもコンパイルできるかもしれないですね。


WebSphereは3.5と4しか使用したことはありませんが、
JDKはインストール済みのJDKを使用するか、
IBM製のJDKを使用するか選択したはずです。

引用:

一般的には、開発機側(又はWindowsプラットフォーム)でなくて、
本番機側(又はLinux/Unixプラットフォーム)でコンパイルしてデプロイするケースが多いのでしょうか?
(一般的というと語弊があるかと思いますが、皆さんの体験やお聞きする範囲という意味ですね)


 私の場合、開発環境と本番環境のOSが異なる場合は、
本番環境でクラスを作成することが多いですね。
OSが同じ場合は開発環境でクラスを作成して、
本番環境にクラスだけ持っていくことが多いですね。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-01-07 17:43
unibon です。こんにちわ。

引用:

おばけさんの書き込み (2004-01-07 17:05) より:
このようなことをやる背景には、クラスファイルの互換性の問題があります。
具体的には、違うバージョンのJDKで作られたクラスファイルには互換性が無い
場合があり、実行時にエラーが出てしまうということもあるためです。
これを避けるために実行環境で再コンパイルします。


もしそうだとすると、たとえば Java Applet は、クライアントの種類ごとにコンパイルし直す必要がありますが、その点についてはどうでしょうか。
クラスファイルの形式やライブラリ内のクラス・メソッドの種類についても、上位互換性はあり、下位互換性がないことだけに注意すれば大丈夫だと思います。ただし、この確認が難しいことや、あるいはプログラムは一般にどんな不確定要素があるか分からないのでターゲットかそれに近い環境でコンパイル・ビルドするに越したことはないですが。

引用:

おばけさんの書き込み (2004-01-07 17:05) より:
ちなみに、私は開発環境がWindows XP Professionalで、実行環境がhp-ux 11iのの時に
これを経験しました。hp-uxのJDKはSunのJDKをライセンスしてhpが独自に実装(移植?)
したものなので、このようなことが起きるのです。なぜなら、SunのJDKとhpのJDKでは
同じバージョンが付いていてもその中身が異なるからです。例えば、hpのJDKでは
バージョン1.2.2からHotSpotがサポートされていたりします。


この現象は興味深いですね。具体的にはどのようなエラーになって現れるのかが気になるところです。
#やっぱり "Write Once, Run Anywhere." は夢?

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