java.lang.annotation-jdk的注解原理与使用

本文深入讲解Java注解的定义、使用及反射读取方法。包括@Override、@Deprecated、@SuppressWarnings等常见注解的作用,以及如何自定义注解并利用@Retention设置保留策略。

      java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类。
@Override,@Deprecated,@SuppressWarnings为常见的3个注解。
注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记,以后,
JAVAC编译器,开发工具和其他程序可以用反射来了解你的类以及各种元素上有无任何标记,看你有什么标记,就去干相应的事。

      注解@Override用在方法上,当我们想重写一个方法时,在方法上加@Override,当我们方法
的名字出错时,编译器就会报错,如图:


       注解@Deprecated,用来表示某个类的属性或方法已经过时,不想别人再用时,在属性和方法
上用@Deprecated修饰,如图:

 

  注解@SuppressWarnings用来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候,
 如图:

  

注解@Retention可以用来修饰注解,是注解的注解,称为元注解。
Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。RetentionPolicy有3个值:CLASS  RUNTIME   SOURCE
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.

[java]  view plain copy
  1. package com.self;  
  2. import java.lang.annotation.Retention;  
  3. import java.lang.annotation.RetentionPolicy;  
  4.   
  5. @Retention(RetentionPolicy.RUNTIME)  
  6. public @interface MyTarget  
  7. { }  
  8. 定义个一注解@MyTarget,用RetentionPolicy.RUNTIME修饰;  
  9. package com.self;  
  10. import java.lang.reflect.Method;  
  11. public class MyTargetTest  
  12. {  
  13.  @MyTarget  
  14.  public void doSomething()  
  15.  {  
  16.   System.out.println("hello world");  
  17.  }  
  18.    
  19.  public static void main(String[] args) throws Exception  
  20.  {  
  21.   Method method = MyTargetTest.class.getMethod("doSomething",null);  
  22.   if(method.isAnnotationPresent(MyTarget.class))//如果doSomething方法上存在注解@MyTarget,则为true  
  23.   {  
  24.    System.out.println(method.getAnnotation(MyTarget.class));  
  25.   }  
  26.   }  
  27. }  
  28. 上面程序打印:@com.self.MyTarget(),如果RetentionPolicy值不为RUNTIME,则不打印。  
  29.   
  30.  @Retention(RetentionPolicy.SOURCE )  
  31. public @interface Override  
  32.   
  33. @Retention(RetentionPolicy.SOURCE )  
  34. public @interface SuppressWarnings  
  35.   
  36. @Retention(RetentionPolicy.RUNTIME )  
  37. public @interface Deprecated  
  38. 由上可以看出,只有注解@Deprecated在运行时可以被JVM读取到  
  39.   
  40. 注解中可以定义属性,看例子:  
  41. @Retention(RetentionPolicy.RUNTIME)  
  42. public @interface MyAnnotation  
  43. {  
  44.  String hello() default "gege";  
  45.   String world();  
  46.   int[] array() default { 2456 };  
  47.   EnumTest.TrafficLamp lamp() ;  
  48.   TestAnnotation lannotation() default @TestAnnotation(value = "ddd");  
  49.   Class style() default String.class;  
  50. }  
  51. 上面程序中,定义一个注解@MyAnnotation,定义了6个属性,他们的名字为:  
  52. hello,world,array,lamp,lannotation,style.  
  53. 属性hello类型为String,默认值为gege  
  54. 属性world类型为String,没有默认值  
  55. 属性array类型为数组,默认值为2456  
  56. 属性lamp类型为一个枚举,没有默认值  
  57. 属性lannotation类型为注解,默认值为@TestAnnotation,注解里的属性是注解  
  58. 属性style类型为Class,默认值为String类型的Class类型  
  59.   
  60. 看下面例子:定义了一个MyTest类,用注解@MyAnnotation修饰,注解@MyAnnotation定义的属性都赋了值  
  61. @MyAnnotation(hello = "beijing", world="shanghai",array={},lamp=TrafficLamp.RED,style=int.class)  
  62. public class MyTest  
  63. {  
  64.  @MyAnnotation(lannotation=@TestAnnotation(value="baby"), world = "shanghai",array={1,2,3},lamp=TrafficLamp.YELLOW)  
  65.  @Deprecated  
  66.  @SuppressWarnings("")  
  67.  public void output()  
  68.  {  
  69.   System.out.println("output something!");  
  70.  }  
  71. }  
  72.  接着通过反射读取注解的信息:  
  73. public class MyReflection  
  74. {  
  75.  public static void main(String[] args) throws Exception  
  76.  {  
  77.   MyTest myTest = new MyTest();  
  78.     Class<MyTest> c = MyTest.class;  
  79.     Method method = c.getMethod("output"new Class[] {});  
  80.        //如果MyTest类名上有注解@MyAnnotation修饰,则为true  
  81.   if(MyTest.class.isAnnotationPresent(MyAnnotation.class))  
  82.   {  
  83.    System.out.println("have annotation");  
  84.   }  
  85.    if (method.isAnnotationPresent(MyAnnotation.class))  
  86.    {  
  87.    method.invoke(myTest, null); //调用output方法  
  88.    //获取方法上注解@MyAnnotation的信息  
  89.      MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);  
  90.     String hello = myAnnotation.hello();  
  91.    String world = myAnnotation.world();  
  92.    System.out.println(hello + ", " + world);//打印属性hello和world的值  
  93.    System.out.println(myAnnotation.array().length);//打印属性array数组的长度  
  94.    System.out.println(myAnnotation.lannotation().value()); //打印属性lannotation的值  
  95.    System.out.println(myAnnotation.style());  
  96.    }  
  97.     //得到output方法上的所有注解,当然是被RetentionPolicy.RUNTIME修饰的  
  98.      Annotation[] annotations = method.getAnnotations();  
  99.       for (Annotation annotation : annotations)  
  100.   {  
  101.    System.out.println(annotation.annotationType().getName());  
  102.   }  
  103.    }  
  104. }  
  105. 上面程序打印:  
  106. have annotation  
  107. output something!  
  108. gege, shanghai  
  109. 3  
  110. baby  
  111. class java.lang.String  
  112. com.heima.annotation.MyAnnotation  
  113. java.lang.Deprecated  
  114.   
  115. 如果注解中有一个属性名字叫value,则在应用时可以省略属性名字不写。  
  116. 可见,@Retention(RetentionPolicy.RUNTIME )注解中,RetentionPolicy.RUNTIME是注解属性值,属性名字是value,  
  117. 属性的返回类型是RetentionPolicy,如下:  
  118. public @interface MyTarget  
  119. {  
  120.     String value();  
  121. }  
  122. 可以这样用:  
  123.   @MyTarget("aaa")  
  124.  public void doSomething()  
  125.  {  
  126.   System.out.println("hello world");  
  127.  }  
  128.    
  129. 注解@Target也是用来修饰注解的元注解,它有一个属性ElementType也是枚举类型,  
  130. 值为:ANNOTATION_TYPE CONSTRUCTOR  FIELD LOCAL_VARIABLE METHOD PACKAGE PARAMETER TYPE  
  131. @Target(ElementType.METHOD) 修饰的注解表示该注解只能用来修饰在方法上。  
  132. @Target(ElementType.METHOD)  
  133. @Retention(RetentionPolicy.RUNTIME)  
  134. public @interface MyTarget  
  135. {  
  136.  String value() default "hahaha";  
  137. }  
  138. 如把@MyTarget修饰在类上,则程序报错,如:  
  139. @MyTarget  
  140. public class MyTargetTest  
  141. 注解大都用在开发框架中吧,好了有关注解就学习那么多了,谢谢。  
C:\Users\12527\apache-tomcat-9.0.100\bin\catalina.bat run [2025-05-13 10:55:19,558] 工件 system:war exploded: 正在等待服务器连接以启动工件部署… Using CATALINA_BASE: "C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc" Using CATALINA_HOME: "C:\Users\12527\apache-tomcat-9.0.100" Using CATALINA_TMPDIR: "C:\Users\12527\apache-tomcat-9.0.100\temp" Using JRE_HOME: "C:\Users\12527\.jdks\temurin-22.0.2" Using CLASSPATH: "C:\Users\12527\apache-tomcat-9.0.100\bin\bootstrap.jar;C:\Users\12527\apache-tomcat-9.0.100\bin\tomcat-juli.jar" Using CATALINA_OPTS: "" NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 13-May-2025 10:55:20.722 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/9.0.100 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Feb 13 2025 11:29:56 UTC 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 9.0.100.0 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 11 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: C:\Users\12527\.jdks\temurin-22.0.2 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 22.0.2+9 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Eclipse Adoptium 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: C:\Users\12527\apache-tomcat-9.0.100 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.lang=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.io=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc\conf\logging.properties 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote= 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.port=1099 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.ssl=false 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.password.file=C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc\jmxremote.password 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.access.file=C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc\jmxremote.access 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.rmi.server.hostname=127.0.0.1 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djdk.tls.ephemeralDHKeySize=2048 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dsun.io.useCanonCaches=false 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dignore.endorsed.dirs= 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=C:\Users\12527\apache-tomcat-9.0.100 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=C:\Users\12527\apache-tomcat-9.0.100\temp 13-May-2025 10:55:20.729 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.4]加载了基于APR的Apache Tomcat本机库[1.3.1]。 13-May-2025 10:55:20.729 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR功能:IPv6[true]、sendfile[true]、accept filters[false]、random[true]、UDS [true]。 13-May-2025 10:55:20.729 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL配置:useAprConnector[false],useOpenSSL[true] 13-May-2025 10:55:20.733 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 3.0.14 4 Jun 2024] 13-May-2025 10:55:20.846 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"] 13-May-2025 10:55:20.857 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[276]毫秒内初始化 13-May-2025 10:55:20.902 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 13-May-2025 10:55:20.902 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/9.0.100] 13-May-2025 10:55:20.911 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"] 13-May-2025 10:55:20.949 信息 [main] org.apache.catalina.startup.Catalina.start [90]毫秒后服务器启动 已连接到服务器 [2025-05-13 10:55:21,189] 工件 system:war exploded: 正在部署工件,请稍候… 13-May-2025 10:55:21.499 警告 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [5.0]。将使用默认版本。 13-May-2025 10:55:21.655 警告 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [5.0]。将使用默认版本。 13-May-2025 10:55:23.948 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke 调用方法[manageApp]时发生异常 java.lang.IllegalStateException: 启动子级时出错 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:602) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:603) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1751) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:264) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:803) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:453) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:407) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:264) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:803) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1412) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1570) Caused by: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/system_war_exploded]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:406) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:179) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599) ... 36 more Caused by: java.lang.IllegalStateException: 由于StackOverflower错误,无法完成对web应用程序[/system_war_exploded]的批注的扫描。可能的根本原因包括-Xss的设置过低和非法的循环继承依赖项。正在处理的类层次结构是[com.opensymphony.xwork2.interceptor.NoParameters->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object] at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2307) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2247) at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2204) at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:2177) at org.apache.catalina.startup.ContextConfig.scanWebXmlFragment(ContextConfig.java:2085) at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:2065) at org.apache.catalina.startup.ContextConfig.processClasses(ContextConfig.java:1372) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1273) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:973) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:290) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4407) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ... 37 more 13-May-2025 10:55:23.950 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke 调用方法[createStandardContext]时发生异常 javax.management.RuntimeOperationsException: 调用方法[manageApp]时发生异常 at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:274) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:803) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:453) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:407) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:264) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:803) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1412) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) [2025-05-13 10:55:23,969] 工件 system:war exploded: 部署工件时出错。请参阅服务器日志了解详细信息。 at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1570) Caused by: java.lang.IllegalStateException: 启动子级时出错 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:602) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:603) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1751) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:264) ... 30 more Caused by: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/system_war_exploded]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:406) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:179) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599) ... 36 more Caused by: java.lang.IllegalStateException: 由于StackOverflower错误,无法完成对web应用程序[/system_war_exploded]的批注的扫描。可能的根本原因包括-Xss的设置过低和非法的循环继承依赖项。正在处理的类层次结构是[com.opensymphony.xwork2.interceptor.NoParameters->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object] at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2307) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2247) at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2204) at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:2177) at org.apache.catalina.startup.ContextConfig.scanWebXmlFragment(ContextConfig.java:2085) at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:2065) at org.apache.catalina.startup.ContextConfig.processClasses(ContextConfig.java:1372) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1273) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:973) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:290) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4407) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ... 37 more 13-May-2025 10:55:30.932 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [C:\Users\12527\apache-tomcat-9.0.100\webapps\manager] 13-May-2025 10:55:31.244 信息 [Catalina-utility-1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 13-May-2025 10:55:31.278 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[C:\Users\12527\apache-tomcat-9.0.100\webapps\manager]的部署已在[346]毫秒内完成
最新发布
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值