struts Caused by: no protocol dtd - Class: java.net.URL

简介:

情景:

项目使用了struts2框架,部署到tomcat中,而tomcat所在机器没有联网(处于公司安全方面的原因),所以启动tomcat时,报错:

tomcat Unable to load configuration. - Class: Java.net.SocketInputStream

因为struts配置文件如下:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.         "-//Apache Software Foundation/DTD Struts Configuration 2.1.7//EN"  
  4.         "http://struts.apache.org/dtds/struts-2.3.dtd">  

如上所示,它会 去http://struts.apache.org/dtds/struts-2.3.dtd下载dtd文件,但是没有联网,所以就报上述错误(标红的)了。

 

为了解决这个问题,就使用了本地的dtd文件,范例:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.         "-//Apache Software Foundation/DTD Struts Configuration 2.1.7//EN"  
  4.         "./com/tdr/mbs/endpoint/dtd/struts-2.3.dtd">  

 

后来项目部署到其他tomcat时,报错:

Caused by: no protocol dtd - Class: java.net.URL

详细报错信息:

 

Java代码   收藏代码
  1. Unable to load configuration. - Class: java.net.URL  
  2. File: URL.java  
  3. Method: <init>  
  4. Line: 567 - java/net/URL.java:567:-1  
  5.     at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:69)  
  6.     at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:390)  
  7.     at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437)  
  8.     at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)  
  9.     at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51)  
  10.     at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)  
  11.     at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)  
  12.     at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)  
  13.     at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3838)  
  14.     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4488)  
  15.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  
  16.     at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)  
  17.     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  
  18.     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)  
  19.     at org.apache.catalina.core.StandardService.start(StandardService.java:516)  
  20.     at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)  
  21.     at org.apache.catalina.startup.Catalina.start(Catalina.java:593)  
  22.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  23.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  24.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  25.     at java.lang.reflect.Method.invoke(Method.java:597)  
  26.     at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)  
  27.     at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)  
  28. Caused by: Unable to load file:/D:/个人资料/eclipse/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/endpoint/WEB-INF/classes/struts.xml - Class: java.net.URL  
  29. File: URL.java  
  30. Method: <init>  
  31. Line: 567 - java/net/URL.java:567:-1  
  32.     at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:954)  
  33.     at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:163)  
  34.     at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:130)  
  35.     at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:209)  
  36.     at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)  
  37.     ... 22 more  
  38. Caused by: no protocol: ./com/a//endpoint/dtd/struts-2.3.dtd - Class: java.net.URL  
  39. File: URL.java  
  40. Method: <init>  
  41. Line: 567 - java/net/URL.java:567:-1  
  42.     at com.opensymphony.xwork2.util.DomHelper.parse(DomHelper.java:115)  
  43.     at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:949)  
  44.     ... 26 more  
  45. Caused by: java.net.MalformedURLException: no protocol: ./com/a//endpoint/dtd/struts-2.3.dtd  
  46.     at java.net.URL.<init>(URL.java:567)  
  47.     at java.net.URL.<init>(URL.java:464)  
  48.     at java.net.URL.<init>(URL.java:413)  
  49.     at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)  
  50.     at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)  
  51.     at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source)  
  52.     at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source)  
  53.     at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source)  
  54.     at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)  
  55.     at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)  
  56.     at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)  
  57.     at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)  
  58.     at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)  
  59.     at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)  
  60.     at com.opensymphony.xwork2.util.DomHelper.parse(DomHelper.java:113)  
  61.     ... 27 more  

 

上网查了半天,发现这是tomcat的一个bug。

出现的场景:

 

<!--[if !supportLists]-->(1)   <!--[endif]-->tomcat 的安装目录中有中文字符;

struts.xml中没有使用网络上的dtd文件,而是使用的本地的dtd文件

 

问题原因tomcat 安装目录中有中文字符。

 

解决方法:tomcat的安装目录拷贝到无中文字符的路径中。

 

 后记:后来我使用eclipse运行项目,也报相同的错误,因为我eclipse的工作空间(workspace)是:

D:\个人资料\eclipse\workspace

我的eclipse的工作空间的路径中包含中文字符。

报错信息:

Caused by: Unable to load file:/D:/个人资料/eclipse/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/endpoint/WEB-INF/classes/struts.xml - Class: java.net.URL

File: URL.java

Method: <init>

Line: 567 - java/net/URL.java:567:-1

 

也就是说eclipse把项目部署到了 D:/个人资料/eclipse/workspace/.metadata/ 中

解决方法:修改eclipse的工作区间(没办法了,一定要保证项目部署的路径中没有中文字符

相关文章
|
1月前
|
Java 编译器 Maven
Java“class file contains wrong class”解决
当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
61 3
|
2月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
62 3
|
3月前
|
Java
java基础(4)public class 和class的区别及注意事项
本文讲解了Java中`public class`与`class`的区别和注意事项。一个Java源文件中只能有一个`public class`,并且`public class`的类名必须与文件名相同。此外,可以有多个非`public`类。每个类都可以包含一个`main`方法,作为程序的入口点。文章还强调了编译Java文件生成`.class`文件的过程,以及如何使用`java`命令运行编译后的类。
65 3
java基础(4)public class 和class的区别及注意事项
|
2月前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
22 1
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
59 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
3月前
|
Java
java的class类
java的class类
50 5
|
3月前
|
Java API Nacos
Caused by: java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forge
Caused by: java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forge
197 2
|
3月前
|
Java
flyway报错Caused by: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfigurat
flyway报错Caused by: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfigurat
54 2
|
4月前
|
Java 测试技术 Docker
记录一次很坑的报错:java.lang.Exception: The class is not public.
这篇文章记录了作者在Docker中运行服务进行单元测试时遇到的一系列问题,包括Spring Boot与Spring Cloud版本不一致、Bean注入问题、测试单元引入问题以及公共类和方法的可见性问题,并提供了解决问题的方法和成功测试通过的代码示例。
记录一次很坑的报错:java.lang.Exception: The class is not public.
|
4月前
|
Java
JAVA中public class和class的区别
JAVA中public class和class的区别
57 7