在本地机子上可以运行java3D的APPLET,但是放到服务器上后,在客户端浏览器就不能运行,WHY?(解决高分赠送)

jinweiyi 2008-11-15 08:42:49
我在applet中写了一个java 3D的程序,在自己机子上用appletviewer可以运行,经过applet数字签名后也可以在浏览器上运行,但是上传到服务器后,在客户端的浏览器中就不能运行,服务器中安装了JDK1.5.0和java 3D包。我的WEB工程具体是这样的:我在服务器端同一目录下放置了一个3D的.obj文件和包含APPLET的3d.jar文件,然后在applet中的java3D导入这个文件,html文件中调用applet:<APPLET CODE = "show_3d.class" ARCHIVE = "3d.jar" WIDTH = "200" HEIGHT = "200"><PARAM NAME = na VALUE="a.obj">,用htmlconverter转换后:<object
classid = "clsid:CAFEEFAC-0015-0000-0000-ABCDEFFEDCBA"
codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"
WIDTH = "200" HEIGHT = "200" >
<PARAM NAME = CODE VALUE = "show_3d.class" >

<PARAM NAME = ARCHIVE VALUE = "3d.jar" >
<param name = "type" value = "application/x-java-applet;jpi-version=1.5">
<param name = "scriptable" value = "false">
<PARAM NAME = na VALUE="a.obj">


<comment>
<embed
type = "application/x-java-applet;jpi-version=1.5" \
CODE = "show_3d.class" \
ARCHIVE = "3d.jar" \
WIDTH = "200" \
HEIGHT = "200" \
na ="a.obj"
scriptable = false
pluginspage = "http://java.sun.com/products/plugin/index.html#download">
<noembed>

</noembed>
</embed>
</comment>
</object>
然后在工程的WEB-INF下的lib中添加java3D的ext文件夹(包含j3dcore.jar,j3dutils.jar,vecmath.jar3个包),然后在客户端浏览器运行html文件,但是总是不能运行这个applet插件,错误是:Java Plug-in 1.5.0
使用 JRE 版本 1.5.0 Java HotSpot(TM) Client VM
用户主目录 = C:\Documents and Settings\jinweiyi
java.lang.NoClassDefFoundError: com/sun/j3d/loaders/IncorrectFormatException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at sun.applet.AppletPanel.createApplet(Unknown Source)
at sun.plugin.AppletViewer.createApplet(Unknown Source)
at sun.applet.AppletPanel.runLoader(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

后来我在applet的标签属性ARCHIVE 改成:ARCHIVE ="3d.jar,j3dcore.jar,j3dutils.jar,vecmath.jar",然后将这三个java3D的jar文件添加到和html文件同一目录下,在客户端浏览器中还是不能运行,出错:
2008-11-15 20:27:46 javax.media.j3d.NativePipeline getSupportedOglVendor
SEVERE: java.lang.UnsatisfiedLinkError: no j3dcore-ogl-chk in java.library.path
java.lang.UnsatisfiedLinkError: no j3dcore-d3d in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:231)
at java.security.AccessController.doPrivileged(Native Method)
at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:200)
at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:157)
at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:987)
at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:299)
at show_3d.init(show_3d.java:100)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.lang.NoClassDefFoundError
at show_3d.init(show_3d.java:100)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
再后来我直接在客户端安装了java3D包,但是还是不能运行,出错:java.security.AccessControlException: access denied (java.io.FilePermission a.obj read)
由此,我提出两个问题,一个是在服务器端该如何配置JAVA 3D,一个是applet是不是不能通过动态参数专递直接访问在服务器端的文件,我的applet代码是这样的:
import com.sun.j3d.loaders.objectfile.*;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.Scene;
import java.applet.*;
import java.awt.BorderLayout;
import java.awt.event.*;
import com.sun.j3d.utils.universe.*;
import java.io.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.*;
public class show_3d extends Applet{
public BranchGroup createSceneGraph(String filename){
BranchGroup sceneRoot = new BranchGroup();
BoundingSphere bounds =
new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0);
Color3f bgColor = new Color3f(0.0f,0.0f,5.0f);
Background bg = new Background(bgColor);
bg.setApplicationBounds(bounds);
sceneRoot.addChild(bg);
Color3f lightColor = new Color3f(0.0f,1.0f,1.0f);
Vector3f light1Direction = new Vector3f(4.0f,-7.0f,-12.0f);
Color3f light2Color = new Color3f(0.3f,0.3f,0.4f);
Vector3f light2Direction = new Vector3f(-6.0f,-2.0f,-1.0f);
Color3f ambientColor = new Color3f(0.1f,0.1f,0.1f);
AmbientLight ambientLight = new AmbientLight(ambientColor);
ambientLight.setInfluencingBounds(bounds);
sceneRoot.addChild(ambientLight);
DirectionalLight light1 = new DirectionalLight(lightColor,light1Direction);
light1.setInfluencingBounds(bounds);
sceneRoot.addChild(light1);
DirectionalLight light2 = new DirectionalLight(light2Color,light2Direction);
light2.setInfluencingBounds(bounds);
sceneRoot.addChild(light2);
TransformGroup sceneTG = new TransformGroup();
sceneTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
sceneRoot.addChild(sceneTG);
Alpha rotationAlpha = new Alpha(-1,Alpha.INCREASING_ENABLE,0,0,8000,0,0,0,0,0);
Transform3D yAxis = new Transform3D();
RotationInterpolator rotator = new RotationInterpolator(rotationAlpha,sceneTG,yAxis,0.0f,(float)Math.PI*2.0f);
rotator.setSchedulingBounds(bounds);
sceneTG.addChild(rotator);
TransformGroup objTG = new TransformGroup();
Transform3D objTrans = new Transform3D();
objTG.getTransform(objTrans);
objTrans.setScale(0.6);
objTG.setTransform(objTrans);
sceneTG.addChild(objTG);
int flags = ObjectFile.RESIZE;
ObjectFile f = new ObjectFile(flags,(float)(49.0*Math.PI/180.0));
Scene s = null;
try{
s=f.load(filename);
}
catch(FileNotFoundException e){
System.err.println(e);
System.exit(1);
}
catch(ParsingErrorException e){
System.err.println(e);
System.exit(1);
}
catch(IncorrectFormatException e){
System.err.println(e);
System.exit(1);
}
objTG.addChild(s.getSceneGroup());
return sceneRoot;
}
public void init() {
String filename = getParameter("na"); //获取载入文件的地址参数
setLayout(new BorderLayout());
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center",c);
BranchGroup scene = createSceneGraph(filename);
SimpleUniverse u = new SimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
}
...全文
1022 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
naruto1224 2011-05-10
  • 打赏
  • 举报
回复
请问你的jdk和java3d的版本是多少。
我写的程序application可以运行
但是applet就运行不了
jinweiyi 2008-11-24
  • 打赏
  • 举报
回复
我随便搞了一个最简单的JAVA 3D的applet程序SimpleCone.java显示一个三角:
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.GraphicsConfiguration;

public class SimpleCone extends Applet{

public BranchGroup createSceneGraph() {
BranchGroup objRoot = new BranchGroup();
TransformGroup objTrans = new TransformGroup();
objRoot.addChild(objTrans);
Appearance app = new Appearance();
Material material = new Material();
material.setEmissiveColor(new Color3f(1.0f,0.0f,0.0f));
app.setMaterial(material);
Cone cone=new Cone(.5f,1.0f,1,app);
objTrans.addChild(cone);
objRoot.compile();
return objRoot;
}
public SimpleCone() {
setLayout(new BorderLayout());
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center", c);
BranchGroup scene = createSceneGraph();
SimpleUniverse u = new SimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
}
然后写了一个html文件,用htmlconverter转了之后:<HTML>
<BODY>
<!--"CONVERTED_APPLET"-->
<!-- HTML CONVERTER -->
<object
classid = "clsid:CAFEEFAC-0015-0000-0000-ABCDEFFEDCBA"
codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"
WIDTH = 200 HEIGHT = 150 >
<PARAM NAME = CODE VALUE = SimpleCone.class >
<param name = "type" value = "application/x-java-applet;jpi-version=1.5">
<param name = "scriptable" value = "false">

<comment>
<embed
type = "application/x-java-applet;jpi-version=1.5" \
CODE = SimpleCone.class \
WIDTH = 200 \
HEIGHT = 150
scriptable = false
pluginspage = "http://java.sun.com/products/plugin/index.html#download">
<noembed>

</noembed>
</embed>
</comment>
</object>

<!--
<APPLET CODE = SimpleCone.class WIDTH = 200 HEIGHT = 150>
</APPLET>
-->
<!--"END_CONVERTED_APPLET"-->

</BODY>
</HTML>
然后一起传到服务器上去,保存在同一目录下,然后在客户端(没有安装JAVA 3D)浏览器打开这个网页,applet加载失败,打开java控制台,错误如下,java.lang.NoClassDefFoundError: javax/media/j3d/Node
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at sun.applet.AppletPanel.createApplet(Unknown Source)
at sun.plugin.AppletViewer.createApplet(Unknown Source)
at sun.applet.AppletPanel.runLoader(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
我想肯定是找不到类吧,然后将JAVA 3D三个jar文件加入到D:\Program Files\Java\jre1.5.0\lib\ext下,再运行,又出错:javax.media.j3d.NativePipeline getSupportedOglVendor
SEVERE: java.lang.UnsatisfiedLinkError: no j3dcore-ogl-chk in java.library.path
java.lang.UnsatisfiedLinkError: no j3dcore-d3d in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:231)
at java.security.AccessController.doPrivileged(Native Method)
at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:200)
at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:157)
at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:987)
at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:299)
at SimpleCone.<init>(SimpleCone.java:33)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at sun.applet.AppletPanel.createApplet(Unknown Source)
at sun.plugin.AppletViewer.createApplet(Unknown Source)
at sun.applet.AppletPanel.runLoader(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
我想是那JAVA 3D的4个dll文件没有添加吧,然后将那4个dll文件添加到D:\Program Files\Java\jre1.5.0\bin下,然后运行,就没有问题了
这里我有个问题很疑惑,就是java 3d的运行环境怎么不能自动下载并安装呢,难道要每个客户端非得都要人工安装java 3d的运行环境么?是不是服务器端配置有问题导致这个问题出现?还有java运行环境都是自动从http://java.sun.com/上下载的,难道java 3D的运行环境不能下么,还是需要修改一下codebase属性?请高手们指点一下
jinweiyi 2008-11-23
  • 打赏
  • 举报
回复
我想是客户端在自动下载并安装JAVA 3D运行环境的时候出错,可是怎么会出错的呢,我的代码也没有问题啊,服务器端JAVA3D也是默认安装的,真是有点搞不懂了
jinweiyi 2008-11-23
  • 打赏
  • 举报
回复
没有人能帮我解决么。。。。。
niko7 2008-11-23
  • 打赏
  • 举报
回复
关注……
「已注销」 2008-11-21
  • 打赏
  • 举报
回复
新玩意!呵呵!
jinweiyi 2008-11-21
  • 打赏
  • 举报
回复
因为在本地机子上,也是以resin作为服务器的,java3D是默认安装的,它的3个包是自动添加到java_homejre\lib\ext和jre1.5.0\lib\ext下的,我在web工程下的WEB-INF\lib中没有添加这三个包,可以在本地浏览器上运行,但是添加到了服务器就不行了,估计是环境变量有问题吧,但是就是到现在还没有解决问题,请高手们帮帮忙啊
cjmiou 2008-11-21
  • 打赏
  • 举报
回复
帮顶
shenjie1989 2008-11-21
  • 打赏
  • 举报
回复
晕啊,太难
jinweiyi 2008-11-21
  • 打赏
  • 举报
回复
那在服务器端(resin)如何配置JAVA 3D,直接默认安装好像不行,还需要在我的WEB应用工程下添加什么,或者是在环境变量中作什么修改,我以前没有搞过这个东西,也算是新手了,现在搞的头都大了,请懂这方面的高手指点一下,搞定了一定多加分
clwahaha 2008-11-16
  • 打赏
  • 举报
回复
没用过 帮顶下
KOOK_OKKO 2008-11-16
  • 打赏
  • 举报
回复
具体做法是:找到您的ie浏览器使用的jre包,我的是:D:\Program Files\Java\jre1.6.0\lib\security,在这个包下面有个java.policy文件,打开编辑它:在grant里增加2个语句:permission java.lang.RuntimePermission "accessClassInPackage.sun.jdbc.odbc";
permission java.util.PropertyPermission "file.encoding", "read";
KOOK_OKKO 2008-11-16
  • 打赏
  • 举报
回复
用数字签名,具体的网上很多例子
KOOK_OKKO 2008-11-16
  • 打赏
  • 举报
回复
通常,将从网络或远程资源下载的Applet视为不可信的。只有 满足以下条件的Applet才能视为可信的:安装在本地文件系统或在本地主机上执行的Applet。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧