こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Java 3D Web Start のソースコード一例を教えてください

私は、Java3Dでプログラムを作成しています。
作成したプログラムの実行結果を仲間に示したいのですが、多くの仲間はJavaJREについてはプレインストールパソコンを使っていますが、Java3Dはインストールしておらず見てもらうことができません。

先日、OKWave殿を通じてJavaWebStartの存在を知り、特に紹介されたJavaNetのJava 3D Web Start( https://j3d-webstart.dev.java.net/test/ )には、rotating cube、moving sphereなどいくつかの3Dサンプルが画面をクリックすると見ることができます。

ただし、いずれも jnlpファイルで紹介されていて、ソースコードは紹介されていません。

JavaWebStartは、プログラム(ソースコード)を作成後、classファイルをjarファイルにかためて、jnlpファイルと共にWebサーバにアップすることでプログラム実行結果を仲間にも見てもらえるようになりますが、私の認識ではSwingで書かれたアプリケーション、しかもjnlpファイルのapplication-desc 要素にはオプション属性 main-class を記載するため、ソースコードには、「public static void main(String argv[]) メソッドを含む、最初に実行されるクラス」の記載が必要になってくるかと思います。

Swingアプリケーションを扱う多くのサイトに紹介されているコンポーネント、レイアウトなどを示すサンプルソースコードは上の方法にて、JWSで表示させることができたのですが、3DをJavaNet社のサンプルのように表示させることができていません。

java3D Web Startで表す3Dの簡単モデル(できれば、回転アニメ、behaviorなど動きのあるもの)をソースコードとともに、またWebサーバにアップするまでの手順を教えていただきたいと存じます。

投稿日時 - 2008-08-17 12:38:26

QNo.4257080

すぐに回答ほしいです

質問者が選んだベストアンサー

(3)
>3つのjarファイルを(,)で区切り書きましたが、
カンマではなく半角スペースで区切ってください。惜しい!
マニフェストファイルの末尾の改行も、くれぐれもお忘れにならないよう……。

(5) jarやdllが入っているフォルダを、そのフォルダごと圧縮するとうまくいくと思います。

(7) Java3Dがインストールされているtaiheyさんのパソコンでは、上記のクラスパスが間違っていても
Javaがlib-extのフォルダから Java3D を見つけてきたので実行できたのでしょう。
たぶん上記のクラスパスのを直せばうまくいくと思います。
もちろんご友人のパソコンに Java がインストールされていることもお確かめください。
(ちなみにANo.1の(3)の延長で、Java3Dだけでなく Javaそのものも同梱してしまう荒業すら可能だったりします。
その場合Java のインストール作業すら不要ですが、合計サイズは100メガバイトぐらいになります。)

>2 <security><all-permissions/></security>を加えると表示できなくなります

そうです。すべての権限を要求してしまうので署名がないと実行できません。

>import javax.swing.*;を追加記述すると

swing にも Java3D にも Box というクラスがあるので、コンパイラがどちらか区別できなくなっています。
「import javax.swing.*;」でパッケージごとインポートするのではなく「import javax.swing.JFrame;」で
JFrame だけインポートしてみてください。
このへんは Java3D というより Java の基本なので、入門書などをあたってください。
それで「コントラクターMainFrame(sample, int, int)は未定義です。」も直る……かな?

投稿日時 - 2008-08-21 22:20:35

補足

Ao.4ありがとうございました。

(3)について
アドバイスいただいたように
(1) マニフェストファイルのClass-Path属性に記入する3つのjarファイルを半角スペースで区切りました。
(2) マニフェストファイルの末尾は改行するようにしています。

その後、前回と同じように、コマンドプロンプロにて、Sample3D.jarを下記で作成しました。

>jar cvfm Ssample3D.jar META-INF\MANIFEST.MF *.class

次に、Sample3D.jarとJava3Dからコピーした4つのdllファイルと、3つのjarファイルをまとめて、今回はLhacaで圧縮したところ、圧縮ファイルtest7.lzhができました。(前回は、Lhaplusで圧縮しようとしました。)

圧縮したファイルを仲間に送り、解凍後にSample3D.jarをクリックしてもらい確かめてもらいましたが、前回同様に表示しませんでした。(仲間のパソコンには jre1.6.0_05 がインストールされています。)

上記の圧縮ファイル test7.lzh と、半角スペースで区切り作成したマニフェストファイルも含めた圧縮ファイル test7a.lzh をサイトのトライ7にアップします。

前回の補足で記載した手順に、今回の修正を加えて作成した次第です。hirusagariさんのアドバイスに従ってしたつもりですが、私が作成したどこかに誤りがあるのかもしれません。申し訳ありませんが、再確認していただけますでしょうか。

(2)について
アドバイスいたように、「import javax.swing.*;」を「import javax.swing.JFrame;」に変えたところ、Box箇所3カ所のエラーはなくなりました。

そこで、次に、
public final class Sample3D extends Applet { をコメントアウトにして、public final class Sample3D extends JFrame { を追加したところ、やはり、「コントラクターMainFrame(sample, int, int)は未定義です。」のエラーが生じました。

この部分をコメントアウトし、下記を
sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //追加
sample.setBounds(10, 10, 300, 200); //追加
sample.setTitle("タイトル"); //追加
sample.setVisible(true); //追加

public static void main(String[] args) {
Sample3D sample = new Sample3D();
の後に追加したところ、エラーはなくなり、実行させたところ表示させることができました。

それで、jnlpファイルを作り、トライしたところ、JavaWebSrartが起動し表示させることができました。(サイトのトライ8に示します。)

サイトを仲間に送り確認してもらったところ、JavaWebStartを軌道させることができず、表示しませんでした。(この場合も、Java3Dをインストールしていないと表示させることができないのでしょうか?)

尚、この仲間もサイトのトライ1とトライ2(何れもJava3Dではない)の場合は、JavaWebStartが起動し、表示させることができたそうです。

誠に申し訳ありませんが、更にアドバイスいただきたく、よろしくお願いします。

投稿日時 - 2008-08-22 11:16:02

お礼

hirusagariさん、補足にて(3)の方法について、「マニフェストファイルのClass-Path属性に記入する3つのjarファイルを半角スペースで区切りました。にもかかわらず、仲間(Kさん)のパソコンでは表示できませんでした。」と書きましたが、その後、jre1.6.0_07をインストールしている別の仲間MさんとSさんのパソコンでは、Java3Dをインストールしていないけれども、表示できました。

Kさんのパソコンでは前にも書きましたが、jre1.6.0_05です。インストールしているバージョンが多少以前の場合は表示できないのでしょうか?それともKさんの解凍、その他操作が不適切だったのでしょうか?

結論としては、hirusagariさんがリコメンドされる(3)の方法では、表示できるということになりました。まだ未確認ですが、この方法ではSwingアプリケーション方式にしないでも、私が作成してきた多くのアプレット方式3Dに対しても有効ではないかと思い、明日にでも確かめようと思っています。

どうもありがとうございました。

尚、Sさんのパソコンにても、JavaWebStartは起動しますが、3D(トライ8)は表示させることができませんでした。トライ1とトライ2(何れも3Dではありません)は表示させることができました。トライ8の場合のソースコードを検討しなおさないと実現できそうにもありませんが、私にはもはや難しそうです。

(2)の方法に対し、何か、すぐにでもお気づきのことがありましたらアドバイスをお願いいたします。

先ずは、お礼まで 

投稿日時 - 2008-08-22 20:27:12

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

うまくいったようで何よりです。
一部のご友人のパソコンで起動できたのなら、Java ソースコードや Jar の構成はただしくできている思います。

Java3D はハードウェアの機能を使いますので、実行するハードウェアの構成によって動作がことなることがあります。
たとえば、CPU が Intel 系か AMD 系かによっても必要なファイルが違います。
起動できないかたのパソコンの構成がわからないので、自分にはこれ以上は推測しようがありません。

JRE のバージョンによっても問題が発生する場合がありますが、jre1.6.0_05 ならかなり新しいので「たぶん」大丈夫でしょう。

もし問題が CPU の違いにあるとすれば、
以下のページからその環境に対応するファイルをダウンロードして Jar と DLL を置き換える必要があります。
https://java3d.dev.java.net/binary-builds.html

これで解決しないとなると、Web 上の限られたやり取りではこんどこそお手上げです。

>アプレット方式3D
残念ながら署名のないアプレットでは(3)の方法は使えません。
アプレットのセキュリティ制限によって Java3D の DLL がロードできないからです。
もしこれができてしまうと、DLL を悪意のあるプログラムに置き換えれば
アプレットを実行したユーザのコンピュータを攻撃できてしまいます。
DLL の中までは Java のセキュリティ制限が効かないため、
署名のないアプレットが勝手に DLL をロードするわけにいかないのです。
Java3D は DLL が必要ですが、他に DLL が必要ないアプレットであれば署名がなくても実行できます。

(2)の方法については jar を署名するしか方法は思いつきません。というかたぶん署名しない限り無理です
Java Web Start のセキュリティの考え方についてはアプレットの場合とだいたい同じです。

投稿日時 - 2008-08-22 23:43:05

お礼

hirusagariさん、ANo.5、そして今回も合計で5回にわたりいろいろ教えていただきありがとうございました。

今回の課題につきましては、hirusagariさんのリコメンドされる方法で解決できましたし、Java Web Start の制約、その他についても実地で学ぶこともできました。

>アプレット方式3Dにつきましても、hirusagariさんのリコメンドされる方法(3)でしてみました。自分のマシンだけではできましたが、署名のないアプレットではJava3Dをインストールしていない仲間のマシンでは表示できないということになるのですね。詳しく教えていただいてありがとうございました。

誠に、ありがとうございました。

PS
前回教えていただいたリファクタリングにつきましては、入門書を読み始めました。またeclipseにリファクタリング機能が備わっているとのことなので、こちらも操作しながら腰を落ち着けて覚えるようにしたいと思います。いずれ質問させていただくことになろうかと思いますが、またよろしくお願いいたします。

投稿日時 - 2008-08-23 07:15:12

ANo.3

もしかしていけるかなー?とか思っていましたが無理でしたね。
あてにならないことを言ってしまってすみません。

<security><all-permissions/></security>

ですべての権限を要求すると、さすがに

署名されていないアプリケーションがシステムへの無制限のアクセスを要求しています

とエラーがでますね。
Java3Dのサイトのデモはちゃんと署名してあるようです。それがなくても、

java.security.AccessControlException: access denied (java.util.PropertyPermission * read,write)

とやっぱりセキュリティ関連でエラーがでますね。スタックトレースを見る限り、
com.sun.j3d.utils.applet.MainFrameがなぜかシステムプロパティを参照しようとしていてエラーがでてしまうようです。
もしかしたらMainFrameじゃなくてJFrameならいけるかも……なんて思いましたが、うまくいく保証はありません。
というわけで、

>AppletをSwingJavaのJFrameに変えてみたらどうなるか、

というのはもしかしたら効果があるかもしれませんね。
もちろんその場合は同時に他の部分も修正する必要があります。

Java Web Start で起動するには署名する手もあるわけですが、
署名はあれこれ知識が必要ですし、かなり手間がかかります……。
自分もこれ以上は Java Web Start で起動する方法が思いつきません。
おちからになれず申し訳ありません。

Java Web Start のようにWebページのリンクから直接起動することはできませんが、
自分はやっぱり ANo.1の(3)がいちばん楽だと思うのです……。
Zipをダウンロードして解凍、実行ファイルをダブルクリック――という手順は
ある意味「普通の手順」なので、エンドユーザもそこまで嫌がらないでしょうし。
ちなみに自分の手元のJOGL(Java3Dとは別の3Dグラフィックス用API)をつかったアプリケーションは
(3)の方法でつくっています。

投稿日時 - 2008-08-20 02:01:54

補足

hirusagariさん、ANo.3ありがとうございました。
> あてにならないことを言ってしまってすみません。
とんでもありません。試行錯誤していろいろさせていただき大変感謝しています。

1 アドバイスに従い、ANo.1の(3)を下記の方法でトライしました。

(1) 3つのjarファイルと4つのdllファイルは、それぞれC:\Program FilesのJava-Java3D-1.5.1のlib-extフォルダとbinフォルダにありました。合計7つのファイルを、ローカルのtest6フォルダにコピーしました。

(2) 同じtest6フォルダには、hirusagariさんが編集し私がeclipseで実行させたアプリケーション(Sample3D)のソース、classファイル類も集結しました。

(3) また、同フォルダにMETA-INFフォルダを作り、下記で構成したMANIFEST.MFファイルを作りました。

Manifest-Version: 1.0
Created-By: 1.6.0_03 (Sun Microsystems Inc.)
Main-Class: Sample3D
Class-Path: j3dcore.jar, j3dutils.jar, vecmath.jar

Class-Path属性に上記のように3つのjarファイルを(,)で区切り書きましたが、これでよいのでしょうか?

(4) 次に、コマンドプロンプトにて、アプリケーションのjarファイル(Sample3D.jar)を下記のようにして作成しました。

>jar cvfm Sample3D.jar META-INF\MANIFEST.MF *.class

(5) そのあと、上記(1)の7つのファイルと(4)で作成したSample3D.jar(総合計8ファイル)を、手持ちの圧縮・解凍ソフトにて1つの圧縮ファイルにしようとしたのですが、このソフトではjarファイルを逆に解凍してしまう結果になり、圧縮ファイルを作ることができませんでした。(どうすれば圧縮させることができるでしょうか?アドバイスをお願いします。)

(6) そこで、Webサーバ(次のサイト:http://www.geocities.jp/java3dtest/QA09/question9.html)に8つのファイルをアップしようとしましたが、4つのdllファイルは(-)を含んでいてWebサーバで受け付けてくれないために、これら4ファイルをまとめて圧縮(kaitou.lzh)とし、残りの4つのファイルと共にアップしました。サイトのトライ6を参照してください。

(7) サイト6に記載した手順にて、合計8つのファイルを同一フォルダにまとめた上で、Sample3D.jarをダブルクリックすると、私は実行し、画像が表示されるのですが、Java3Dをインストールしていない仲間のパソコン上では表示させることができません。

ということで、hirusagariさんの教えを私が十分に理解していないからだと思うのですが、私の操作間違い、理解不足など指摘していただきたいと、またまたお願いです。

2 次に、 ANo.1の(2)の方法についてですが、私が実施した簡単なサンプル(サイトのトライ2)ではJWSで表示できたのですが、このときのjnlpファイルに、<security><all-permissions/></security>を加えると表示できなくなります。サイト:http://www.geocities.jp/java3dtest/QA09/question9.html のトライ5を参照ください。

私がJava3DでないJavaアプリケーション(JavaSwing)でJWSで表示できたサンプルでは、何れもjnlpファイルには、<security>要素の記述がなく、これらアプリケーションのソース記述では、何れも下記の記述があります。 

(1) import javax.swing.*;
(2) public class xxx extends JFrame{
(3)  public static void main(String[] args){
xxx frame = new xxx();
注)xxxはアプリケーションクラス名

そこで、hirusagariさんに編集していただいたSample3Dに対して、eclipseで先ず(1)のimport javax.swing.*;を追加記述すると、下記のコード3行(何れもpublic static void main(String[] args) { 内の記述です。)が「型boxあいまいです。」とコメントが付きエラーとなります。

1) group.addChild(new Box(0.05f, 0.05f, 0.08f, bapp));
2) group.addChild(new Box(getRadius(), getHeight(), 0.3f,
rapp));
3) group.addChild(new Box(0.25f, 0.02f, 0.02f, gapp));

また、(1)に加えて、AppletをJFrameに変えようと、先頭部分 public final class Sample3D extends Applet { を public final class Sample3D extends JFrame { に変更すると、上記3行に加えて、最後のnew MainFrame(sample, 800, 600);の部分が、「コントラクターMainFrame(sample, int, int)は未定義です。」がコメントが付いてエラーになります。

hirusagariさんは、「自分もこれ以上は Java Web Start で起動する方法が思いつきません。おちからになれず申し訳ありません。」とのことですが、これらエラーに対してエラーを解消する何らかのアイデアを思い付かれましたらアドバイスいただきたいと思います。

多大の時間を割いていただき、誠に申し訳ありませんが、よろしくお願いいたします。

投稿日時 - 2008-08-20 14:38:49

ANo.2

Geociticesに配置したjnlpもちゃんと実行できるようですね。

>Java アプリケーションと……具体的にはどのような記述方法になるのでしょうか?
ですから、今までと何も変わりません。
たとえばqa4223955で書いたソースコードをJava Web Startで起動できるようにする場合、ソースコードには何も変更を加える必要はないはずです。

>シンプルなケースを例にして示していただけるでしょうか?
「シンプルで具体的なケース」がまさに Java3D のサイトにあるデモですから、
自分が何か具体例を与えるよりは、まずはこれを詳しく調べてみてはどうでしょうか。
自分はなにか新しい技術を試すときには、まずはサンプルをそのまま(といっても自分の環境で動くような最低限の修正を加えて)実行してみて、
それが動作することを試してから、いろいろと変更を加えて調べてみることをします。
jnlp を書くのもできていらっしゃるようですから、あとは jnlp の拡張の書き方だけのように思います。
自分もほとんどJava Web Startは扱ったことがないので、
自分ならまずはjava3dのデモのjnlpをそっくり真似てみますね。
http://www.geocities.jp/java3dtest/QA09/question9.html の jnlp との違いを比べてみると、

<security>
<all-permissions/>
</security>

と、

<extension href="http://download.java.net/media/java3d/webstart/release/java3d-latest.jnlp"/>

があるのが気になりますね。もしかしたらこれだけ書き足したら
Java Web Startが勝手に上のURLから必要なファイルを取ってきて動くんじゃないですかね?
残念ながら、Java Web Startについてこれ以上は自分にはわかりません。

ANo.1の(3)は
・実行ディレクトリに j3dcore.jar, j3dutils.jar, vecmath.jar, j3dcore-d3d.dll, j3dcore-ogl.dll, j3dcore-ogl-cg.dll, j3dcore-ogl-chk.dll をコピーする
・自分のアプリケーションのjarのmanifest.mfのClass-Path属性にj3dcore.jar, j3dutils.jar, vecmath.jarを追加する
・エンドユーザにはZipかなにかでまるごとダウンロードさせて、ローカルでJarを実行させる
ということです。

投稿日時 - 2008-08-18 07:31:48

補足

hirusagariさん、早速回答いただきありがとうございました。

アドバイスいただいた、「自分ならまずはjava3dのデモのjnlpをそっくり真似てみますね。」の件ですが、該当jnlpファイルをどのようにしてダウンロードするか思いつかなかったのですが、改めて試行錯誤してみたらできました。
そして、<extension href="​http://download.java.net/media/java3d/webstart/release/java3d-lates...​の記述を確認しました。

自分の作成したjnlpファイルと比較検討し、先日教えていただいたJava3Dのソースコードでトライしたいと思います。本日これから所用があり夜分、或いは明日確かめてみます。

ANo.1の(3)についても、補足ありがとうございました。こちらもトライしてみます。また、結果を報告させていただきます。

ありがとうございました。

投稿日時 - 2008-08-18 09:33:50

お礼

hirusagariさん、アドバイスに従い下記をトライする前に、もう一度別の簡単なSwingApplication(JPanelTest)をJWSで表示させてみました。今回はjnlpファイルの中への<resources>要素の記述<j2se version="1.5+"/>は、Java3D Web Startのサンプルに併せて1.5+としました。結果は同様で表示できました。(下記サイトのトライ2に示します。)

この後、下記を実施しました。
1)Java3Dで教えていただいたソースコード(AQNo4で示していただいたソース)には何も変更を加えずに、トライ2で作成したjnlpファイルに対して、codebase(jnlpファイルの3行目)と <resources>要素に記載するjarファイル名、それにapplication-descに記載するメインクラス名を変えて実行しました。結果は表示できませんでした。(下記サイトのトライ3に示します。)

2)次に、上記のjnlpファイルに、<security>要素と、resources 要素にはextension要素を、Java3D Web Startのサンプルに示されている通りに追加して実行しました。結果はやはり表示できませんでした。(下記サイトのトライ4に示します。)

尚、途中、<security>要素だけとか、extension要素だけを加えても結果は同じでした。

また、Java3D Web Startのサンプルに示すjava3d-latest.jnlpをダウンロードし、私の登録しているWebサーバに置こうかとも考えましたが、このjnlpファイルをダウンロードすることができませんでした。

3)hirusagariさんが編集されたソースコードの、
public final class Sample3D extends Applet {
部分のAppletをSwingJavaのJFrameに変えてみたらどうなるか、このときはimport javax.swing.*;
を加えてみたらどうかなどもトライしてみたのですが、そうするとソース自体にエラーが生じてしまいました。

ANo.1の(3)については、現在のところ実施していません。

先ず、JWSで表示できるようにしたいのですが、上記のように足踏み状態です。引き続きトライはしてみますが、またアドバイスいただければと思います。よろしくお願いします。

参照サイト: http://www.geocities.jp/java3dtest/QA09/question9.html

投稿日時 - 2008-08-19 11:39:47

ANo.1

Java Web Start は Java アプリケーションを Web を通して起動させる方法ですから、
通常の Java アプリケーションとソースコードの書き方は(セキュリティ関連を除けば)あまり変わりません。
jnlpの説明はあってもソースコードそのものの解説がないのはそのためです。
おっしゃるとおり、Java アプリケーションと同様に、main-class に指定されるクラスには main メソッドの定義が必要になります。

Java3D を利用したアプリケーションを起動するには、
(1)別個にユーザに Java3D をインストールさせる
(2)extension に Java3D を指定してアプリケーションを Java Web Start で起動させる
(3)Java3D をアプリケーションに同梱する
のみっつの方法が自分には思いつきます。
(1)は開発者は楽ですが、面倒と感じるエンドユーザが多いかもしれません。
(2)は Java3D 公式サイトでも使われている無難な方法ですが、Web サーバの設定によっては使いにくいかもしれません。
(とはいえ、たとえ Geocities が jnlp に対応していなくても、jnlp をただのテキストファイルとしてダウンロードさせて、
ローカルに保存してから起動することもできるようです)
(3)はライセンスが許せば、エンドユーザも特別な操作が要らないのでお勧めです。
簡単に調べただけですが、再配布の規定はされているようなので同梱することもできそうです。
DLL をそのアプリケーションのルートに配置し、jarにクラスパスを設定するだけなので、
手順としては難しくはありません。

投稿日時 - 2008-08-17 17:06:52

補足

hirusagariさん、早速そしてご丁寧な回答ありがとうございました。

3つの方法の
(1)は、Java3Dのプログラム作成で、私もこれまでトライしてきた方法ですね。途中作成段階で友人・仲間の何人かに見てもらおうとしたのですが、彼らはプログラム作成には興味が薄く、通常プレインストールされているJRE以外にインストールする気持ちを持っていないこともあり、Java Web Startの勉強 をはじめました。

(2)の、Java Web Start (JWS)は、Swing JavaでコーディングしたJava アプリケーションのclassファイルをJARにまとめ、このJARファイルと共に、JWSを起動させるJNLPファイルをWevサーバにアップロードする必要があるとのことです。
尚、Yahoo Geocities では、jnlpファイルをアップロードできるファイルの種類の1つにしていることがわかりました。
それで、広く紹介されているSwing Javaで書かれたサンプルの1つ(JTextArea)を例にして、これを私のテスト用サーバにアップしてJWSでみるようにしました。下記のサイトをご確認ください。

http://www.geocities.jp/java3dtest/QA09/question9.html

この例では、メインクラスの「JTextAreaTest」が「JFrame」をextendしているようになっています。(ソースコードを参照してください。)

hirusagariさんのご回答では、「extension に Java3D を指定しては」、また、「Java アプリケーションとソースコードの書き方も、セキュリティ関連を除いて、あまり変わりません。」とのことですが、具体的にはどのような記述方法になるのでしょうか?

誠に申し訳ないのですが、前回QNo.4223955のボタンクリックで設計変更に応じるJava3D物体を作るには?(その2)で示していただいた3Dのアプリケーション、或いは、これに近いシンプルなケースを例にして示していただけるでしょうか?

(3)の方法については、私のレベルでは、イメージがつかめないため、上記の(2)の方法で目標とするところに近づけたいのですが、よろしくお願いします。 

投稿日時 - 2008-08-18 00:43:14

あなたにオススメの質問