【问题标题】:Eclipse - Tomcat 7 - java.lang.IndexOutOfBoundsException on publishEclipse - Tomcat 7 - 发布时的 java.lang.IndexOutOfBoundsException
【发布时间】:2013-11-22 12:51:32
【问题描述】:

我有一个使用 maven 的 Web 项目,当我尝试将其部署到 Tomcat 7 时,我收到以下消息:

Publishing failed
Could not publish to the server.
java.lang.IndexOutOfBoundsException
Could not publish server configuration: myworkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\server.xml (The system cannot find the path specified.). 
myworkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\server.xml (The system cannot find the path specified.)

当我在 'myworkpace.metadata.logs' 中查看 tomcat 的日志文件时,我看到以下内容:

!ENTRY org.eclipse.wst.server.core 4 0 2013-11-22 13:36:40.128
!MESSAGE Publishing failed
!SUBENTRY 1 org.eclipse.wst.server.core 4 0 2013-11-22 13:36:40.128
!MESSAGE Could not publish to the server.
!STACK 0
java.lang.IndexOutOfBoundsException
    at java.io.BufferedInputStream.read(BufferedInputStream.java:338)
    at org.eclipse.jdt.internal.compiler.util.Util.getInputStreamAsByteArray(Util.java:498)
    at org.eclipse.jdt.core.ToolFactory.createDefaultClassFileReader(ToolFactory.java:269)
    at org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities.isEJBArchive(JavaEEArchiveUtilities.java:900)
    at org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities.refineForJavaEE(JavaEEArchiveUtilities.java:606)
    at org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities.openArchive(JavaEEArchiveUtilities.java:370)
    at org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities.openBinaryArchive(JavaEEArchiveUtilities.java:290)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper$ArchiveCache.openArchive(JavaEEBinaryComponentHelper.java:612)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper.openArchive(JavaEEBinaryComponentHelper.java:470)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper.getUniqueArchive(JavaEEBinaryComponentHelper.java:422)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper.getArchive(JavaEEBinaryComponentHelper.java:415)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper.getJavaEEQuickPeek(JavaEEBinaryComponentHelper.java:98)
    at org.eclipse.jst.j2ee.project.JavaEEProjectUtilities.getJ2EEComponentType(JavaEEProjectUtilities.java:273)
    at org.eclipse.jst.j2ee.internal.common.exportmodel.JEEHeirarchyExportParticipant.isChildModule(JEEHeirarchyExportParticipant.java:42)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.isChildModule(FlatVirtualComponent.java:367)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.addUsedReferences(FlatVirtualComponent.java:305)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.treeWalk(FlatVirtualComponent.java:235)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.cacheResources(FlatVirtualComponent.java:188)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.fetchResources(FlatVirtualComponent.java:118)
    at org.eclipse.wst.web.internal.deployables.FlatComponentDeployable.members(FlatComponentDeployable.java:227)
    at org.eclipse.jst.j2ee.internal.deployables.J2EEFlexProjDeployable.members(J2EEFlexProjDeployable.java:267)
    at org.eclipse.wst.server.core.internal.ModulePublishInfo.getDelta(ModulePublishInfo.java:407)
    at org.eclipse.wst.server.core.internal.ServerPublishInfo.getDelta(ServerPublishInfo.java:366)
    at org.eclipse.wst.server.core.internal.Server.getPublishedResourceDelta(Server.java:1574)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.getPublishedResourceDelta(ServerBehaviourDelegate.java:698)
    at org.eclipse.jst.server.tomcat.core.internal.TomcatServerBehaviour.getPublishedResourceDelta(TomcatServerBehaviour.java:958)
    at org.eclipse.jst.server.tomcat.core.internal.PublishOperation2.publishDir(PublishOperation2.java:137)
    at org.eclipse.jst.server.tomcat.core.internal.PublishOperation2.execute(PublishOperation2.java:82)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.performTasks(ServerBehaviourDelegate.java:1335)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:954)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:774)
    at org.eclipse.wst.server.core.internal.Server.publishImpl(Server.java:3153)
    at org.eclipse.wst.server.core.internal.Server$PublishJob.run(Server.java:345)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
!SUBENTRY 1 org.eclipse.jst.server.tomcat.core 4 0 2013-11-22 13:36:40.128
!MESSAGE Could not publish server configuration: C:\IBM\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\server.xml (The system cannot find the path specified.).
!STACK 0
java.io.FileNotFoundException: myworkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\server.xml (The system cannot find the path specified.)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:149)
    at org.eclipse.jst.server.tomcat.core.internal.TomcatVersionHelper.publishCatalinaContextConfig(TomcatVersionHelper.java:499)
    at org.eclipse.jst.server.tomcat.core.internal.Tomcat70Configuration.publishContextConfig(Tomcat70Configuration.java:674)
    at org.eclipse.jst.server.tomcat.core.internal.TomcatServerBehaviour.publishFinish(TomcatServerBehaviour.java:462)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:1011)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:774)
    at org.eclipse.wst.server.core.internal.Server.publishImpl(Server.java:3153)
    at org.eclipse.wst.server.core.internal.Server$PublishJob.run(Server.java:345)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

如果我再次尝试发布,我只会收到第一个错误:

Could not publish to the server.
java.lang.IndexOutOfBoundsException

在日志中:

!ENTRY org.eclipse.wst.server.core 4 0 2013-11-22 13:41:18.645
!MESSAGE Could not publish to the server.
!STACK 0
java.lang.IndexOutOfBoundsException
    at java.io.BufferedInputStream.read(BufferedInputStream.java:338)
    at org.eclipse.jdt.internal.compiler.util.Util.getInputStreamAsByteArray(Util.java:498)
    at org.eclipse.jdt.core.ToolFactory.createDefaultClassFileReader(ToolFactory.java:269)
    at org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities.isEJBArchive(JavaEEArchiveUtilities.java:900)
    at org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities.refineForJavaEE(JavaEEArchiveUtilities.java:606)
    at org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities.openArchive(JavaEEArchiveUtilities.java:370)
    at org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities.openBinaryArchive(JavaEEArchiveUtilities.java:290)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper$ArchiveCache.openArchive(JavaEEBinaryComponentHelper.java:612)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper.openArchive(JavaEEBinaryComponentHelper.java:470)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper.getUniqueArchive(JavaEEBinaryComponentHelper.java:422)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper.getArchive(JavaEEBinaryComponentHelper.java:415)
    at org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper.getJavaEEQuickPeek(JavaEEBinaryComponentHelper.java:98)
    at org.eclipse.jst.j2ee.project.JavaEEProjectUtilities.getJ2EEComponentType(JavaEEProjectUtilities.java:273)
    at org.eclipse.jst.j2ee.internal.common.exportmodel.JEEHeirarchyExportParticipant.isChildModule(JEEHeirarchyExportParticipant.java:42)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.isChildModule(FlatVirtualComponent.java:367)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.addUsedReferences(FlatVirtualComponent.java:305)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.treeWalk(FlatVirtualComponent.java:235)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.cacheResources(FlatVirtualComponent.java:188)
    at org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.fetchResources(FlatVirtualComponent.java:118)
    at org.eclipse.wst.web.internal.deployables.FlatComponentDeployable.members(FlatComponentDeployable.java:227)
    at org.eclipse.jst.j2ee.internal.deployables.J2EEFlexProjDeployable.members(J2EEFlexProjDeployable.java:267)
    at org.eclipse.wst.server.core.internal.ModulePublishInfo.fillCache(ModulePublishInfo.java:314)
    at org.eclipse.wst.server.core.internal.ModulePublishInfo.getDelta(ModulePublishInfo.java:396)
    at org.eclipse.wst.server.core.internal.ServerPublishInfo.getDelta(ServerPublishInfo.java:366)
    at org.eclipse.wst.server.core.internal.Server.getPublishedResourceDelta(Server.java:1574)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.getPublishedResourceDelta(ServerBehaviourDelegate.java:698)
    at org.eclipse.jst.server.tomcat.core.internal.TomcatServerBehaviour.getPublishedResourceDelta(TomcatServerBehaviour.java:958)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.computeDelta(ServerBehaviourDelegate.java:874)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:909)
    at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:774)
    at org.eclipse.wst.server.core.internal.Server.publishImpl(Server.java:3153)
    at org.eclipse.wst.server.core.internal.Server$PublishJob.run(Server.java:345)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

我尝试从全新安装开始(干净的 eclipse、干净的 tomcat 和干净的工作空间),从 CVS 导入代码,但仍然是同样的问题

任何人对什么可能不正确(或我如何找到问题)有任何想法?

编辑

当我将项目构建到另一台计算机上的 WAR 文件中并通过管理控制台将这个 WAR 文件直接部署到 tomcat 时,它可以工作。

我的猜测是构建必须以某种方式有所不同......

EDIT2

我删除了完整的 Maven 存储库。在此之后,我能够正确构建项目并使用导出的 war 文件在 Tomcat 上运行它。

但是,当我尝试直接从 eclipse 发布时,我仍然收到 IndexOutOfBoundsException

EDIT3

在多次删除 Maven 存储库后,我能够构建并运行该项目。 Maven 似乎有时会损坏。

如果其他人应该有这个问题,请删除完整的 Maven 目录并在工作区中的每个项目上运行 maven 更新。

【问题讨论】:

  • EDIT3 中的解决方案对我有用。谢谢!
  • 我应该在哪里删除 Maven 目录?在 Eclipse 或 Maven 安装目录?

标签: eclipse maven tomcat7


【解决方案1】:

maven 存储库可能已损坏。最好删除完整的存储库并更新工作区中的所有项目。

【讨论】:

  • 我遇到了同样的问题,但是删除存储库和更新项目不起作用。有其他选择吗?
  • 我的 maven repo 非常大,所以我不想删除其中的所有文件。那么我可以删除名为“org”的目录吗?我认为stacktrace中的每个类都以org开头。 @dshgna
  • 这解决了我的问题。但是,您不需要删除整个存储库,而是可以在项目上执行 maven 安装。它将在构建日志中显示损坏的 jar 文件。这将省去再次删除和下载整个存储库的麻烦。
【解决方案2】:

虽然这个问题已经得到解答 - 这是一个存储库损坏的问题,但可以通过在 eclipse 之外将战争部署到 Tomcat 来确定存储库中的哪个 jar 损坏。

在我的情况下,Tomcat 然后在其日志中报告问题所在(guava-13.0.1.jar):

严重:无法处理来自 Jar 的 Jar 条目 [com/google/common/collect/package-info.class] [jar:file:/C:/Java/tomcat/apache-tomcat-7.0.42/webapps/myapp/WEB-INF/lib/guava-13.0.1.jar!/] 用于注释 java.util.zip.ZipException:无效的 LOC 标头(错误的签名)

【讨论】:

  • 我展示了如何确定哪个 Jar 文件已损坏 - 在 Eclipse 中遇到问题时并不明显。
  • 如何在eclipse之外部署到Tomcat?
【解决方案3】:

很可能是你的本地 maven 存储库的一些 jar,它们包含在你的 .war 中,因为依赖项已损坏。 正如 jtsnr 建议的那样,您可以在 Eclipse 之外部署您的 .war 以发现哪个 jar 已损坏。但是有一个更快的解决方案。只需找到 maven 项目的 /target 目录(或解压缩 .war)并找到 *.jar 文件(应该在 WEB-INF/lib 下)。 现在,使用一个简单的压缩工具(例如:7-Zip)全选并解压。您将收到有关您拥有的每个损坏文件的提示:在此之后,在您的 Maven 存储库中找到该文件并删除该文件的整个版本。 这样,如果你有一个大的 repo,你就可以节省很多时间来避免重新下载整个 jar 生态系统:) HTH..

【讨论】:

  • 这确实是最好的答案。每当发生这种情况时删除整个库似乎不是一个好的解决方案。
【解决方案4】:

让我们按照下面提到的方式尝试一次。所以请删除之前的安装。 第1步 创建一个新的服务器运行时 (窗口 -> 首选项 -> 服务器 -> 运行时环境)。 第2步 将服务器添加到 Eclipse (窗口 -> 显示视图 -> 服务器)添加新的服务器配置(右键单击并选择新建 -> 服务器),但不要向其中添加任何项目。 第 3 步 打开服务器概览页面 双击新的服务器配置以打开服务器概述页面,我们在其中为服务器设置端口和超时。 第 4 步

在服务器位置下选择使用 Tomcat 安装。保存。

您现在应该可以启动服务器了。现在将您的项目添加到服务器,您就可以开始了。

【讨论】:

  • 当我这样做时,我仍然得到第二个错误:无法发布到服务器。 java.lang.IndexOutOfBoundsException
  • 不使用Eclipse能否独立启动服务器
  • 是的,如果我导入另一台机器上构建的相同代码的war文件,不使用eclipse直接在tomcat中导入,应用程序运行正常。我已经编辑了我的帖子,包括这个新发现。我相信在构建代码时一定有问题,而不是实际运行它。
猜你喜欢
  • 1970-01-01
  • 2019-09-10
  • 2014-08-02
  • 1970-01-01
  • 2014-07-15
  • 2012-06-13
  • 2013-05-07
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多