精华内容
下载资源
问答
  • 150) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4640) 在idea中即使正确配置了tomcat,但是有时会报错,类似这种找不到xxx类,是因为idea并没有把我们pom文件中的依赖jar...

    先看一下错误信息

    08-Mar-2021 13:53:47.744 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart 配置应用程序监听器[org.springframework.web.context.ContextLoaderListener]错误
    	java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    		at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
    		at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
    		at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:539)
    		at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:520)
    		at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:150)
    		at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4640)
    

    在idea中即使正确配置了tomcat,但是有时会报错,类似这种找不到xxx类,是因为idea并没有把我们pom文件中的依赖jar包打入到运行中的项目
    解决方法
    1.打开Project Structure
    在这里插入图片描述
    2.点击Artifacts -> 点击Output Layout -> 在图示目录下新建lib文件夹
    在这里插入图片描述3.选中lib文件夹,然后点击上面的 +
    在这里插入图片描述4.将jar包全部选中,点击OK
    在这里插入图片描述5.当项目中有多个模块的时候,还需要将其他模块引入。选中classes文件夹,将其他模块导入。
    在这里插入图片描述重新运行,问题得到解决

    展开全文
  • 我们知道,通常情况下,我们会将java文件的字符集修改成utf-8,这样,理所当然地就认为:JVM在加载class的时候,自然是按照utf-8进行解析的。事实并非如此:JVM加载class文件默认采用的字符集,是由操作系统来决定的...

    1.情景展示

    做了这么长时间的java开发,但是,你知道JVM是以怎样的编码加载、解析class文件的吗?

    我们知道,通常情况下,我们会将java文件的字符集修改成utf-8,这样,理所当然地就认为:JVM在加载class的时候,自然是按照utf-8进行解析的。

    事实并非如此:JVM加载class文件默认采用的字符集,是由操作系统来决定的。

    换句话说,JVM会根据操作系统的字符集来解析你的class文件,而不是智能的去判断你的class文件的字符集而进行解析。

    这样,肯定有问题。

    2.原因分析

    以win7/win10中文操作系统为例,我们借助开发工具以utf-8将java文件编译成class文件,而解析的时候却以GBK的编码加载到JVM中,不出问题才怪!

    但是,问题恰恰就出现在了这里,一直都是以utf-8进行编译,以gbk进行解析,中文也没有出现乱码问题,至于为什么,我没有想通。

    今天的重点不在这里,重点是,我们怎么让JVM以utf-8的格式解析class文件?

    3.解决方案

    方案一:设置环境变量

    快捷键:win+r--》输入sysdm.cpl-->回车--》高级--》环境变量--》系统变量--》新建

    455df7b54d7c9ac520328d2fb60cba2c.png

    变量名设置为:JAVA_TOOL_OPTIONS

    变量值设置为: -Dfile.encoding=UTF-8

    确定即可。

    方案二:修改tomcat

    路径:{TOMCAT_HOME}/bin/catalina.bat

    打开该文件,在有对JAVA_OPS设置的地方,添加代码

    21adbb6dc7e69d1e415b652296235302.png

    :设置JVM以utf-8格式解析class文件

    set "JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8"

    重新启动tomcat即可。

    注意:如果你像上面那样修改成utf-8后,重启后的tomcat,日志肯定乱码。

    4bc7346d33f439d769a1de05d3a353d0.png

    因为Tomact日志字符集采用的是gbk,java强制将gbk转换成utf-8后,造成乱码是自然的事情了。

    位置:{TOMCAT_HOME}/conf/logging.properties文件

    9239149c18dd890d8e2bd87819fcea58.png

    #指定tomcat日志字符集

    java.util.logging.ConsoleHandler.encoding = GBK

    修改成功后,日志便不再乱码。

    2e4f639710c3adebb6e86ad8fdc0ee03.png

    提醒:在Windows下,在黑窗口使用命令对java文件进行编译且没有指定字符集的前提下,编译时默认采用的也是gbk的编码,与java文件本身的字符集无关。

    写在最后

    哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

    相关推荐:

    展开全文
  • 完全相同(同包同名)的class如何加载2. 完全相同的class如果在不同war包里如何加载印象中应该是不同war包各自加载自己的, 猜测是因为会启动各自的application级别classloader, 稍微调查之后发现自己原来的认...

    今天下午被同事问到如果我有两个不同版本的class分别放在两个module里如何处理(我们项目里的module是分布在不同的war包里的)

    然后引出下面的问题

    1. 完全相同(同包同名)的class如何加载

    2. 完全相同的class如果在不同war包里如何加载

    印象中应该是不同war包各自加载自己的, 猜测是因为会启动各自的application级别classloader, 稍微调查之后发现自己原来的认识不够深入

    参考 http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html

    我们知道jvm加载class默认是采用 父类委托 模型, 这个模型在之前的文章中我提到过

    参考 http://lizhe.name.csdn.net/node/91

    java默认提供3种classloader

    1. Bootstrp loader

    加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类

    2. ExtClassLoader

    加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库

    3. AppClassLoader

    加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器

    getSystemClassLoader 返回的就是这个加载器

    当一个classloader需要去加载类com.test.A时, 它首先会在自己的加载缓存中查找这个类,如果发现就直接返回,如果没有发现并不会直接加载,而是让自己的父类加载器去加载

    等一下, 父类加载器会立即加载这个类么, 当然不是, 父类加载器也会采用同样的策略, 在自己的缓存中查找,如果没有找到, 就委托给自己的父类, 一直到Bootstrp loader

    如果一直到Bootstrp loader 这一层仍然找不到这个类, classloader才会自己加载它

    tomcat实际上采用了不同的类加载机制

    9b01c7c8a58623a67c381f341e23549c.png

    这里tomcat的Bootstrap实际上包含了jvm的Bootstrap和ExtClassLoader ($JAVA_HOME/jre/lib/ext), 加载了一些jvm最基本的类

    System classloader 忽略系统本身的classpath, 加载

    $CATALINA_HOME/bin/bootstrap.jar — Contains the main() method that is used to initialize the Tomcat server, and the class loader implementation classes it depends on.

    $CATALINA_BASE/bin/tomcat-juli.jar or $CATALINA_HOME/bin/tomcat-juli.jar — Logging implementation classes. These include enhancement classes to java.util.logging API, known as Tomcat JULI, and a package-renamed copy of Apache Commons Logging library used internally by Tomcat. See logging documentation for more details.

    If tomcat-juli.jar is present in $CATALINA_BASE/bin, it is used instead of the one in $CATALINA_HOME/bin. It is useful in certain logging configurations

    $CATALINA_HOME/bin/commons-daemon.jar — The classes from Apache Commons Daemon project. This JAR file is not present in the CLASSPATH built by catalina.bat|.sh scripts, but is referenced from the manifest file of bootstrap.jar.

    Common classloader 用于加载tomcat lib目录下的jar和class, 不要把webapp相关jar放在这里

    unpacked classes and resources in $CATALINA_BASE/lib

    JAR files in $CATALINA_BASE/lib

    unpacked classes and resources in $CATALINA_HOME/lib

    JAR files in $CATALINA_HOME/lib

    一般来说,这个目录包含

    annotations-api.jar — JavaEE annotations classes.

    catalina.jar — Implementation of the Catalina servlet container portion of Tomcat.

    catalina-ant.jar — Tomcat Catalina Ant tasks.

    catalina-ha.jar — High availability package.

    catalina-tribes.jar — Group communication package.

    ecj-*.jar — Eclipse JDT Java compiler.

    el-api.jar — EL 2.2 API.

    jasper.jar — Tomcat Jasper JSP Compiler and Runtime.

    jasper-el.jar — Tomcat Jasper EL implementation.

    jsp-api.jar — JSP 2.2 API.

    servlet-api.jar — Servlet 3.0 API.

    tomcat-api.jar — Several interfaces defined by Tomcat.

    tomcat-coyote.jar — Tomcat connectors and utility classes.

    tomcat-dbcp.jar — Database connection pool implementation based on package-renamed copy of Apache Commons Pool and Apache Commons DBCP.

    tomcat-i18n-**.jar — Optional JARs containing resource bundles for other languages. As default bundles are also included in each individual JAR, they can be safely removed if no internationalization of messages is needed.

    tomcat-jdbc.jar — An alternative database connection pool implementation, known as Tomcat JDBC pool. See documentation for more details.

    tomcat-util.jar — Common classes used by various components of Apache Tomcat.

    tomcat7-websocket.jar — WebSocket 1.1 implementation

    websocket-api.jar — WebSocket 1.1 API

    下面重点来了

    WebappX  加载器闪亮登场

    WebappX — A class loader is created for each web application that is deployed in a single Tomcat instance. All unpacked classes and resources in the /WEB-INF/classes directory of your web application, plus classes and resources in JAR files under the /WEB-INF/lib directory of your web application, are made visible to this web application, but not to other ones.

    也就是说, 每个webapp都会拥有一个独立的WebappX加载器, 它会加载/WEB-INF/classes和/WEB-INF/lib下的所有资源, 只对这个webapp可见,不共享给其他webapp

    这个行为是基于 Servlet Specification, version 2.4, section 9.7.2 Web Application Classloader 有兴趣的朋友可以去读一下

    WebappX  会先尝试自己加载需要的类,而不是使用父类委托模型委托给自己的父加载器, 但是这里有一些例外, JRE base classes不会被这个加载器处理,还有就是Servlet API classes也不会被这个加载器加载, 所以不要把这些例外放在自己的WEB-INF/lib文件夹里

    默认的加载顺序是

    Bootstrap classes of your JVM

    /WEB-INF/classes of your web application

    /WEB-INF/lib/*.jar of your web application

    System class loader classes (described above)

    Common class loader classes (described above)

    如果设置了 则加载顺序是

    Bootstrap classes of your JVM

    System class loader classes (described above)

    Common class loader classes (described above)

    /WEB-INF/classes of your web application

    /WEB-INF/lib/*.jar of your web application

    最后我要加入一个自己以往的经验

    测试的时候如果需要在tomcat中放入同包同名的类(有时候为了测试方便,比如com.lizhe.Test在一个已经被部署的jar包里,但是测试的时候为了覆盖掉)

    可以直接在classes文件夹里放入com.lizhe.Test.class 这个class会被优先加载

    如果需要覆盖一个jar包, 比如test.jar,可以将新的jar包命名为aaaaa.jar , 因为根据实际测试, tomcat加载同路径下的jar包时会按照字母顺序排序,aaaaa.jar会优先于test.jar加载

    展开全文
  • tomcat bin里面有个catalina.bat ifnot"%SECURITY_POLICY_FILE%"==""gotodoSecurity %_EXECJAVA%-verbose:class%JAVA_OPTS%%CATALINA_OPTS%%DEBUG_OPTS%-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%"-...

     

     

     

     

    在tomcat bin里面有个catalina.bat

     

     

    if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
    %_EXECJAVA% -verbose:class %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
    goto end

    加入 -verbose:class.

    可以看到启动时类的加载.

    值得注意的关键是:tomcat按上述顺序依次加载资源,当后加载的资源与之前加载的资源相重时,后加载的资源会继续加载并将之前的资源覆盖。

    展开全文
  • 文章目录一、Tomcat如何将请求传递到SpringBoot中的MVC框架? 一、Tomcat如何将请求传递到SpringBoot中的MVC框架?
  • 在eclipse下运行成功,tomcat下运行时找不到指定的类解决思路public Class> createClassObj(String className){StringBuffer sb = new StringBuffer();sb.append("package ...
  • 比较两个类是否相等,只有在这两个类是由同一个类加载加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等 这里的相等包括...
  • 记录一次关于tomcat启动项目成功,但是无法加载加载项目的问题。 最近优化一个老项目,前后台不分离基于SSM、JSP,在配置eclipse运行环境后,发现tomcat可以正常启动(启动迅速),发现没有编译项目,没有项目启动的...
  • Java和Tomcat加载机制

    2021-03-14 14:06:02
    加载类是运行程序的基础,了解Java和Tomcat的类加载机制对更有效地开发、调试Web应用程序有一定的积极作用。本文简单介绍Java和Tomcat的类加载机制,希望对大家有所帮助。•JDK/JRE文件结构在安装JDK后,其典型的...
  • - 前言 -你了解 Apache Tomcat 的类加载机制吗?本文将从底层原理切入,彻底揭秘Tomcat加载所涉及的源码、机制和方案,助你深入掌握 Tomcat ...
  • <Context path="/webcgfclient" docBase="webcgfclient" reloadable="true"> </Context> <Context path="/weixinpay" docBase="weixinpay" reloadable="true">...reloadable告诉Tomcat需要监控..
  • Tomcat的类加载器可以分为两部分,第一个是Tomcat自身所使用的类加载器,会加载jre的lib包及tomcat的lib包的类,遵循类加载的双亲委派机制;第二个是每个Web应用程序用的,每个web应用程序都有自己专用的...
  • Tomcat 的类加载机制

    2021-10-16 19:14:38
    Tomcat 实际上只有WebAppClassLoader 加载器中打破了双亲委派,其他类加载器还是遵循双亲委派的。 这样做最主要原因是保证同个 Web 容器中的不同 Web 应用程序所使用的类库相互独立,避免相互影响
  • 网上很多资料(包括官方文档)都说有common、system这些类加载器。但是我调试源码的时候并没有看到这些类加载器。 tomcat version:8.5.42 本文研究两个问题。 1、JAVA_HOME/lib/ext和/WebApp/WEB-INF/lib中有相同全...
  • 1 JVM架构整体架构在进入classloader分析之前,先了解一下jvm整体架构:JVM架构JVM被分为三个主要的子系统(1)类加载器子系统(2)运行时数据区(3)执行引擎1. 类加载器子系统Java的...启动类加载器 (BootStrap class Lo...
  • tomcat加载机制

    2020-12-21 10:48:26
    2.如果该类没有被加载过,它会把请求委派给父类加载器(调用父类加载器的loadClass()方法)去完成。 如果父类加载器为空,默认使用启动类加载器作为父类加载器。 3.只有父类加载器无法加载这个类(它的搜索范围中...
  • Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载加载不到时再交给commonClassLoader走双亲委托。对于JVM来说:...
  • 本篇文章我们来探索一下Tomcat的类加载机制,如果我们搜Tomcat的类加载机制,绝大多数结果都会给出答案——打破双亲委托机制。但是感觉很多文章介绍的都不是很清楚,所以本篇文章就从我的理解上来分析一下Tomcat的类...
  • 由于在tomcat加载数据库时,即使在项目中引入了mysql 包,tomcat这个时候也只会去他的lib 文件夹下去找依赖包,所以在这种情况下,我们只需要在tomcat 的 lib 文件夹下,将我们的mysql jar包复制进去即可。...
  • 1、小心class内中的project 的类的后,替换文件需要加上 $classMapper这个类, 编译成class的时候,会把public class 中的protected class 编译为$.class , 所以替换的时候也要找到这个class替换上, 不过对于这中替换,...
  • Tomcat加载机制

    2021-01-31 20:29:42
    5. Tomcat加载机制 java类(.java)编译成字节码文件(.class)字节码文件需要被加载到jvm内存中(这个过程就是一个类加载的过程) 类加载器(ClassLoader,说白了也是一个类,jvm启动的时候先把类加载器读取到内存...
  • 至于不同操作系统具体的加载方式,需要看tomcat源码,还没看~~~ 结论 由于生效的class不同,导致本地和服务器的结果不同,不想看源码的话,可以先把hibernate的重复类删掉;应该是可以对源码进行修改,比如改成...
  • Tomcat 如何加载Spring?

    2021-08-16 16:08:13
    1. Tomcat 提供的接口 SCIs 通过SPI 方式被注册和使用,所有MVC 框架必须包含 META-INF/services/javax.servlet.ServletContainerInitializer 文件,并且在里面指定自己的实现类。 public interface ...
  • The important thing to know about using JNI under Tomcat is that one cannot place the native libraries OR their JNI interfaces under the WEB-INF/lib or WEB-INF/classes directories of a web application...
  • 在Java项目中,如果需要使用.properties类型的文件作为...InputStream is = CommonUtils.class.getClassLoader().getResourceAsStream(“config.properties”);//假设当前这个方法是在CommonUtils类下面 prop.load(is)
  • 记一次:替换class文件重启tomcat无效替换了一个文件,然后重启tomcat后一直不生效 替换了一个文件,然后重启tomcat后一直不生效 如果你修改的内容为final类型的常量,想要生效,则必须将使用该常量的所有类重新编译...
  • 1.先在Web用本地目录下查找要加载的类 2.如果没找到,交给父加载器去查找,它的父加载器就是系统类加载器AppClassLoader 3.如果附加在其也没找到,则抛出ClassNotFound异常
  • 大家注意到了没有,这里的jar包没有路径也没有版本号,这就导致tomcat加载的时候按照hdf5-1.10.3-1.4.3.jar的路径进行加载。 然而我们的工程中在对应位置并不存在这些jar,这也就导致了找不到jar的异常。我们工程中...
  • tomcat加载

    2021-12-14 13:07:15
    tomcat加载

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,234
精华内容 49,693
关键字:

tomcat加载class