我在应用服务器上运行了多个Web应用,每个Web应用WAR文件都包含同一jar文件的副本。
这是否意味着该jar文件中的类将在JVM中多次加载,对于每个存在的WAR文件一次?接下来,如果我在此类中有一个静态同步方法,那么它是否仅在Web应用程序中存在的线程之间同步,而不是与不同类的jar文件中同一类中的同一方法同步?
WAR文件?(希望这个问题有意义,如有必要将予以澄清)。
如果是这种情况,我认为最好的解决方案是从每个WAR文件中删除jar文件并将其部署到服务器上的共享classpath文件夹中?
Java类装入器通常通过按固定顺序在一个或多个位置查找类来工作。例如,从命令行运行应用程序时,加载应用程序的类加载器首先在rt.jar
文件中(其他在bootclasspath上),然后在类路径指定的目录和JAR文件中查找。
Webapp的类加载在原理上类似,但在实践中要复杂一些。对于特定的Web应用程序,Web应用程序的类加载器按以下顺序查找类。例如,Tomcat
6按以下顺序查找类:
当然,一旦类加载器找到了要查找的类,就再也没有发现。因此,以后不会加载具有相同名称的类。
复杂之处在于,Web容器为每个Web应用程序都具有一个类加载器,并且这些类加载器委托给其他管理公共类的类加载器。实际上,这意味着对于整个容器(例如1.和2.),某些类将仅被加载一次,而其他类可能被不同的类加载器加载多次。
(当一个类被多次加载时,将导致不同的Class
对象和不同的类静态特性。就JVM而言,该类的版本是不同的类型,并且您不能从一个版本转换为另一个版本。)
最后,可以将Tomcat配置为允许“热加载”单个Web应用程序。这需要停止一个webapp,为其创建一个新的类加载器,然后重新启动它。
跟进
那么…同步静态方法将不会保护对多次加载该类的共享资源的访问?
这取决于细节,但可能不会。(或者看看是否以另一种方式,如果一个类 实际上
已被多次加载,则该类static
的每个“加载”方法都将访问一组不同的static
字段。)
如果您确实希望单例应用程序类实例由同一容器中的多个webapp共享,则将类放入其中$CATALINA_HOME/lib
或等效类是最简单的。但是您也应该问自己,这是否是好的系统设计。考虑合并Web应用程序,或使用请求转发等代替共享数据结构。单例模式在Web应用程序中往往很麻烦,而且这种情况更是如此。
上面的代码给出了以下错误。 原因:org.springframework.beans.factory.BeanCreationException:创建名为“test1”的bean时出错:注入autowired依赖项失败;嵌套异常为org.springframework.beans.factory.beanCreationException:无法自动连接字段:private Test3 com.pa
目前,我正在使用SonarQube插件将SonarQube与Jenkins集成。我面临的问题是我的Jenkins与Sonarqube运行在不同的服务器上。因此,当我传递sonar.source属性(如)时,由于服务器位置不同,无法找到由Jenkins创建的回购的Jenkins工作区 我的项目是Maven。以下是声纳属性的详细信息: p.s-当Jenkins和SonarQube都在同一台服务器上时,
我刚到spring和安古拉尔群岛。我按照这里的步骤构建后端restful API,它根据请求发送Json。因此,根据指南,当我运行“mvn spring-boot:run”时,tomcat服务器将在localhost:8080启动。 然后我用Yeoman角生成器来构建我的角应用程序。当我在我的angular应用程序中运行“Grunt Serve”时,前端应用程序运行在localhost:9000。
问题内容: 想象一下一个Java类,它具有您可以在类中找到的大多数功能。例如:它从另一个类继承,实现了几个接口,包括一些“静态最终”常量,一些最终常量,一些静态变量,实例变量,一个静态块,一个未命名的代码块(仅是{}中的代码),构造函数,方法等 当所涉及的类首次加载到JVM中时,该类的各个部分以什么顺序初始化或加载到JVM中?JVM中的调用堆栈在加载时是什么样的?假设这里只有一个类加载器在工作。
问题内容: 我想使用Java开发Web应用程序。但是我很困惑所有这些不同的技术是什么以及它们如何协同工作: HTTP 的HTML 的CSS Java脚本 jQuery的 网络容器 小程序 JSP JSTL 表达语言(EL) 在网上可以找到关于这些主题的大量资源,并且每个主题似乎都需要阅读几本书才能理解。您可以解释这些技术,以便在开始开发Web应用程序时对它们有一个基本的了解吗? 问题答案: 请注意
它不使用自定义工厂。并且已经有几个其他模块(对于其他特性来说是gradle模块)正在使用WorkManger而不使用Factory。现在,如果我更改这个配置并添加一个工厂,它可能会破坏其他几个地方的work manager设置。我是否可以只对模块中的WorkManager类使用工厂(或者只有一些WorkManager类应该通过工厂初始化,其他的使用默认配置)。有可能吗?希望我的问题清楚了。