在本地机子上可以运行java3D的APPLET,但是放到服务器上后,在客户端浏览器就不能运行,WHY?(解决高分赠送)
我在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);
}
}