为啥 Spring 项目的导出的可运行 JAR 不能在另一个系统中工作?
Posted
技术标签:
【中文标题】为啥 Spring 项目的导出的可运行 JAR 不能在另一个系统中工作?【英文标题】:Why doesn't an exported runnable JAR of a Spring project work in another system?为什么 Spring 项目的导出的可运行 JAR 不能在另一个系统中工作? 【发布时间】:2013-05-03 20:03:48 【问题描述】:我已经通过 Eclipse 为 Spring 项目创建了一个可执行的 JAR。
它在我的系统上按预期工作,但是当我尝试在另一个系统上执行相同的 JAR 时,它不起作用。它抛出一个异常,如:
Exception-->
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from
relative location [applicationContext-DAO.xml]
Offending resource: class path resource [resources/applicationContext.xml]; nested exception is org.springframework.beans.factory.xml.X
mlBeanDefinitionStoreException: Line 6 in XML document from class path resource [resources/applicationContext-DAO.xml] is invalid; nest
ed exception is org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 336; cvc-elt.1: Cannot find the declaration of element 'bea
ns'.
at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:76)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinition
DocumentReader.java:271)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentR
eader.java:196)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocument
Reader.java:181)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDoc
umentReader.java:140)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocum
entReader.java:111)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at com.nextenders.server.ApplicationContext.initContextFile(ApplicationContext.java:88)
at com.nextenders.server.ApplicationContext.<init>(ApplicationContext.java:60)
at com.nextenders.server.ApplicationContext.getInstance(ApplicationContext.java:45)
at com.nextenders.common.DaoReceiver.processRequest(DaoReceiver.java:49)
at com.nextenders.common.DaoHandler.handleRequest(DaoHandler.java:12)
at com.nextenders.facadeimplementation.facade.UtilityFacade.main(UtilityFacade.java:625)
Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 6 in XML document from class path resource [reso
urces/applicationContext-DAO.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 336; cvc-
elt.1: Cannot find the declaration of element 'beans'.
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinition
DocumentReader.java:255)
... 14 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 336; cvc-elt.1: Cannot find the declaration of element 'beans'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)
... 17 more
C:\programforforkdocument>
我没有得到什么问题?我有一个疑问,比如它与路径有关吗?我的系统在执行时可能会获得正确的路径,因为它是从我的系统创建的吗?
更新:新错误:
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 9 in
XML document from class path resource [resources/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.
我正在使用 spring--3.2.0.RC2.jar 和我的架构条目,如
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
【问题讨论】:
【参考方案1】:参考您的更新:查看此解决方案:
Create runnable jar with maven 3.1 using maven-dependency-plugin doesn't create runnable jar
问题似乎与在组装阶段已被覆盖的内部弹簧文件有关。您使用哪个 maven 插件进行组装?在使用合并了 spring-handlers 和 spring-schemas 的 spring 框架构建 jar 时,您似乎必须使用 maven-shade-plugin。查看问题的解决方案。
【讨论】:
【参考方案2】:将spring-beans
jar 添加到类路径
【讨论】:
它已经在那里了。正如我在这里提到的。它正在创建它的一个系统上运行!但不是另一个。有什么想法吗? 你的xml文件中可能有一些垃圾字符,将其复制到记事本中,看看它是否显示一些奇怪的字符【参考方案3】:在我看来,您可能缺少一个库。我猜是里面有 spring-beans.dtd 文件的那个。
【讨论】:
applicationContext.xml 是一个 XML 文件。 SAXParserException 表示 XML 验证失败,因此出现文本“找不到元素 'beans' 的声明”,这表明 SAX Parser 无法归档名为 'beans' 的元素的定义。这些 Spring XML 元素在 spring-beans-3.0.dtd 中定义,这是一个文档类型定义,定义了 XML 契约,供解析器用来解释 XML 文件。该文件通常在 spring.jar 中,这似乎表明它不在您的类路径中。 这也可能有帮助(在 Google 搜索大约 30 秒后发现):***.com/questions/13814321/… 我已经根据它进行了更改,但它显示了新的错误。我更新了我的问题。有什么想法吗? 您在上下文 XML 的分配 DTD 与正在找到(或完全未找到)的 DTD 之间存在脱节。以上是关于为啥 Spring 项目的导出的可运行 JAR 不能在另一个系统中工作?的主要内容,如果未能解决你的问题,请参考以下文章
使用 `publishToMavenLocal` 构建可以发布到 maven 本地 repo 的可执行 jar - spring boot 项目