为啥 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 项目

Spring Boot导出jar包发布

springboot项目导出可执行的jar包

为啥导出到可运行的 jar 会使应用占用这么多空间?

为啥eclipse导出来的jar包没显示在左侧

用于资源导出的 Maven 配置