从 Java 启动 Spring 应用程序的异常

Posted

技术标签:

【中文标题】从 Java 启动 Spring 应用程序的异常【英文标题】:Exception starting Spring application from Java 【发布时间】:2011-04-08 16:38:13 【问题描述】:

我能够使用 Maven 编译并启动我的 Spring 项目:

mvn -e clean compile exec:java -Dexec.mainClass=de.fraunhofer.fkie.tet.vmware.manager.Test

但是,当我使用maven-assembly-plugin(包括applicationContext.xml)将所有jar 组装到一个文件中时,我总是在java 执行期间得到Exception

java -cp target/test-jar-with-dependencies.jar:. de.fraunhofer.fkie.tet.vmware.manager.Test

  INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
  Sep 6, 2010 10:37:21 AM org.springframework.util.xml.SimpleSaxErrorHandler warning
  WARNING: Ignored XML validation warning
  org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/context/spring-context.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
  ...
  Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: 
  Line 10 in XML document from class path resource [applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: 
  The matching wildcard is strict, but no declaration can be found for element 'context:annotation-config'.
  ...
  Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: 
  The matching wildcard is strict, but no declaration can be found for element 'context:annotation-config'.

我还尝试将架构定义(即spring-context.xsd 等)直接附加到类路径,但没有任何成功。

less src/main/resources/applicationContext.xml

  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:context="http://www.springframework.org/schema/context"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
                             http://www.springframework.org/schema/beans/spring-beans.xsd
                             http://www.springframework.org/schema/context 
                             http://www.springframework.org/schema/context/spring-context.xsd">

      <context:annotation-config />   <!-- wegen '@PostConstruct' -->
  <!--<context:component-scan base-package="de.fraunhofer" />     -->
  ...
  </beans>

【问题讨论】:

你能发布你的 applicationContext.xml - 或者至少是标题部分。我怀疑您的 headers/dtd 参考等有问题。 'applicationContext.xml' 发布在上面。令人惊讶的是,如果使用 'mvn exec:java' 启动应用程序,应用程序运行没有任何问题。 【参考方案1】:

正如它所暗示的那样,请求或响应中的解析存在问题。如果 RestTemplate 客户端期望来自资源的特定类型的响应,但资源完全返回某些内容,则可能会发生此错误。我收到与返回的响应更改有关的 POST RestTemplate 客户端的此错误。

例如返回实体“MyClass”的初始 RestTemplate 更改并盯着返回字符串,因此解析器开始给出错误

 ResponseEntity<MyClass> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, MyClass.class);
 MyClass postResponseBody = postResponseEntity.getBody();

改为

 ResponseEntity<String> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, String.class);
 String postResponseBody = postResponseEntity.getBody();

由于响应类型从实体更改为字符串,解析器在处理响应时开始出错。将其更改为正确的响应类型(在我的例子中是字符串)并开始工作。

【讨论】:

【参考方案2】:

我相信这个问题有 3 个解决方案

    tx jar 文件应包含在项目的类路径/构建路径中。 (最常见的错误) 上面提到的“axtavt” 在“axtaxt”解决方案之前试试这个:转到你的war目录(在GWT编译的高级选项卡中指定)并将spring-tx.jar文件放在你的war目录下的lib文件夹中,刷新并再次运行。

【讨论】:

【参考方案3】:

我怀疑您的 spring 配置文件缺少 context XML 命名空间。它应该像这样添加到你的 spring 配置文件的根元素中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config />
    <context:component-scan base-package="com.abc.xyz" />

</beans>

【讨论】:

感谢您的快速答复!我没有发布我的 applicationContext.xml 文件,因为 'mvn exec:java -Dexec.mainClass=de.fraunhofer.fkie.tet.vmware.manager.Test ' 工作正常。所以我认为配置文件原则上没有问题,它实际上包含上面示例中的所有元素。当我尝试直接从 Java 启动组装版本时,就会出现问题。【参考方案4】:

你的 pom 中有哪些 spring 依赖项?由于某些 spring jar 文件不在类路径上,您可能会遇到 xml 解析错误。在 spring 3 中,该库被拆分为许多 jar 文件。查看this post 看看你需要什么,具体来说:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>$org.springframework.version</version>
</dependency>

【讨论】:

感谢提示,但'spring-context.jar'已经组装在'target/test-jar-with-dependencies.jar'中,即最终jar包含'org/springframework/context /config/spring-context-3.0.xsd'。顺便说一句:我们通过代理服务器与互联网连接。是否有可能,Maven 使用了一些系统范围的代理设置,而 Java 无法从网络连接和检查“.xsd”文档? 更新:这与代理问题无关,因为我通过在家中直接连接到互联网的测试运行验证。【参考方案5】:

根据 axtavt 的回复,我已经找到了这个问题的根本问题,并且我已将其报告为?错误?在 Spring:https://jira.springsource.org/browse/SPR-8368 - 包含生成您自己的这些文件的合并副本的解决方法。为了后代,代码也在这里:

//IOUtils and FileUtils come from Apache Commons IO
for(String s : new String[] "spring.schemas", "spring.handlers", "spring.tooling") 
    Enumeration<?> e = Test.class.getClassLoader().getResources("META-INF/"+s);
    StringBuilder out = new StringBuilder();
    while(e.hasMoreElements()) 
        URL u = (URL) e.nextElement();
        out.append(IOUtils.toString(u.openStream())).append("\n");
    
    File outf = new File(s);
    FileUtils.writeStringToFile(outf, out.toString(), "UTF-8");

【讨论】:

【参考方案6】:

Spring 命名空间处理程序使用文件/META-INF/spring.schemas/META-INF/spring.handlers 解析。由于具有这些名称的文件存在于不同的 Spring jar 中,因此maven-assembly-plugin 之后可能只有其中一个保留在目标 jar 中。

也许您可以手动合并这些文件,并以某种方式配置 maven-assembly-plugin 以使用此合并文件覆盖目标 jar 中的文件。

【讨论】:

是的,你是对的,就是这样!来自不同 jar 的独立“/META-INF/spring.handlers”文件在最终 jar 中丢失。面对这个问题,我决定暂时不使用“maven-assembly-plugin”,而是手动从“target/lib/”目录中包含所有 jars(在“mvn install”之后),例如'java -cp target/lib/spring-aop-3.0.4.RELEASE.jar:target/lib/spring-asm-3.0.4.RELEASE.jar:[...]:target/classes de.fraunhofer.fkie .tet.vmware.manager.Test'。这按预期工作。非常感谢! ;-) @rmv 或者您可以让 maven-dependency-plugin 为您完成复制,如 here

以上是关于从 Java 启动 Spring 应用程序的异常的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot项目启动后出现java.awt.HeadlessException异常

spring4.0+struts2整合,服务器启动时发生的异常

启动spring boot 异常

Spring Boot从入门到精通-项目搭建

Spring boot ---- java.lang.NoClassDefFoundError: javax/servlet/ServletContext

Spring boot ---- java.lang.NoClassDefFoundError: javax/servlet/ServletContext