在我们的应用程序(applet)中,如果找到其中一个必需的jar,我想启用导出功能。我不想添加这个jar applet引用以避免下载大小。
我正在使用Class.forName和其中一个类别来检查特定是否可用。在本地机器中,Class.forName调用重新生成一个实例,尽管jar不在任何类路径中。
任何人都可以解释tomcat类的发现机制。
答案 0 :(得分:1)
Applet在客户端(在用户的浏览器内)运行,而不是在Tomcat Web服务器上运行,因此这与Tomcat无关。
您想要研究Applet类加载器的工作方式。
通常他们会尝试从提取applet的同一个Url下的Web服务器下载类。因此,如果小程序位于http://www.example.com/Hello/HelloApplet 并且需要类foo.bar.MyClass如果在本地找不到它,它将尝试下载http://www.example.com/Hello/foo/bar/MyClass.class。
答案 1 :(得分:0)
根据您对Applet的描述,我没有看到任何选项,只是在applet标记中包含jar文件,因为applet在客户端运行。
您可以为jar文件设置HTTP缓存标头,以允许客户端浏览器缓存它们,因此,您只需支付一次下载费用。
对于经常更改的jar文件,包括jar文件名中的版本号,以避免客户端缓存问题具有相同的命名但内容不同的jar。
编辑:虽然问题是关于tomcat发现jar的方式,但我认为问题的根本原因在于其他地方。
在服务器端的Tomcat 6中,Tomcat在$ TOMCAT_HOME / lib和WEB-INF / lib目录中搜索jar文件。如果在那里添加或删除文件,通常需要重新启动整个Tomcat实例。
<强> EDIT2:强>
您查找jar文件的经验可能是因为您从webapp所在的同一目录运行HTML页面,或者您将JAR文件放在公共位置或公共类路径位置(例如,在JRE / lib / ext中)目录)。
答案 2 :(得分:0)
我很难回答你的问题。如果满足特定的运行时条件,您是否尝试将类下载到applet中?从6u10开始,我相信您可以使用DownloadService
动态下载扩展程序。回到1.2,你可以使用URLCLassLoader.newInstance
,虽然在缓存方面不会那么好。
答案 3 :(得分:0)
这个问题不太清楚。 Tomcat和Applet在类加载方面完全不同。 Applet有一个安全管理器,可以防止某些事情,例如加载任意类。他们必须从Web服务器下载类。 Web服务器不必是tomcat甚至是Java; applet文件只是通过普通HTTP提供的文件。
至于Tomcat,this article explains version 6's classloading。特别是,Tomcat使用类加载器的层次结构来查找类。有几个众所周知的位置会自动加载罐子,例如$CATALINA_HOME/lib
或$CATALINA_HOME/shared/lib
。它还加载了web-app自己的jar和类。类加载器的工作原理如下:
答案 4 :(得分:0)
原因:之前引用的其他库(jar)之一有我正在寻找的类。