tomcat如何能够找到不属于app libs中任何jar的类的类

时间:2009-06-25 11:53:09

标签: java applet

在我们的应用程序(applet)中,如果找到其中一个必需的jar,我想启用导出功能。我不想添加这个jar applet引用以避免下载大小。

我正在使用Class.forName和其中一个类别来检查特定是否可用。在本地机器中,Class.forName调用重新生成一个实例,尽管jar不在任何类路径中。

任何人都可以解释tomcat类的发现机制。

5 个答案:

答案 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和类。类加载器的工作原理如下:

  1. 引导类加载器查找核心Java类文件夹。
  2. 系统类加载器查找$ CATALINA_HOME / bin / bootstrap.jar和
  3. $ CATALINA_HOME /斌/ Tomcat的juli.jar
  4. WebAppX类加载器在WEB-INF / classes中查找,然后在WEB-INF / lib
  5. 中查找
  6. 公共类加载器在$ CATALINA_HOME / lib文件夹中查找。
  7. 如果在conf / catalina.properties文件中设置了shared.loader属性,则共享类加载器在$ CATALINA_HOME / shared / classes和$ CATALINA_HOME / shared / lib中查找。

答案 4 :(得分:0)

原因:之前引用的其他库(jar)之一有我正在寻找的类。