我正在使用web文件夹中的jar文件。在web.xml中,提供了servlet类。如果web.xml知道哪个jar文件中存在特定的类???
答案 0 :(得分:0)
这由类加载器机制处理:
JAR文件通常包含"清单" - 列出的文件 JAR的内容。清单可以定义一个JAR类路径 进一步扩展了类路径(但只在从中加载类时) 那个JAR)。可以在中找到JAR类路径访问的类 以下顺序:
通常,JAR-class-path条目引用的类可以找到 虽然它们是JAR文件的一部分。出现的JAR文件 在任何早期的类路径条目之后搜索JAR类路径, 并且在类路径中稍后出现的任何条目之前。然而, 如果JAR类路径指向已搜索的JAR文件 (例如,扩展名或前面列出的JAR文件 类路径)然后不再搜索JAR文件。 (这个 优化可以提高效率并防止循环搜索。) 在JAR文件出现的位置搜索JAR文件 阶级路径。如果JAR文件作为扩展安装,那么任何 它定义的JAR类路径被忽略。所需的所有课程 扩展被认为是SDK的一部分或拥有自己 已作为扩展程序安装。
答案 1 :(得分:0)
这种情况下的神奇词是类路径。
这本书"用Java学习"很好地描述了这一点。
https://www.safaribooksonline.com/library/view/learning-java/1565927184/ch03s03.html
Java CLASSPATH变量,包含可以搜索包含Java类文件的包的位置列表。在本地主机上搜索包和类时,Java解释器和Java编译器使用CLASSPATH。
就像我们将目录位置添加到dos / linux中的路径变量一样,我们可以在classpath变量中指定jar的位置。 Java还提供了一些默认位置。例如 ext目录。 Windows安装中java文件夹的路径可能看起来像" C:\ Program Files \ Java \ jdk1.6.0 \ JRE \ lib中\分机" 。 您可以将您的jar放在ext文件夹中,其中的类文件将自动定位..
类路径上的位置可以是目录名称或类归档文件的名称。 Java以其自己的Java归档(JAR)格式支持类文件的归档。这允许将大型类组分布在单个文件中;必要时,Java解释器会自动从存档中提取单个类文件。
Java解释器知道如何查找核心类,核心类是每个Java安装中包含的类。例如,java.lang,java.io等中的类。它们的位置不需要放在类路径中,Java解释器可以自己找到它们。 要查找其他类,Java解释器将按顺序搜索类路径上的位置。
例如,考虑搜索类vehicle.cars.Porche。搜索类路径目录/ usr / lib / java意味着解释器在/usr/lib/java/vehicle/cars/Porche.class中查找单个类文件。如果该类存在于jar文件中,请说CompanyVehicle.jar,那么编译器将在CompanyVehicle.jar中查找vehicle.cars.Porche.class。
总而言之,Java有一个它知道应该查看的位置列表。除此之外,它将查看您在classpath变量中提供的位置。
如果你想了解更多关于类路径,类加载器如何在幕后工作的信息,请查看下面的链接
How JVM starts looking for classes?