18

我有一个刚刚从 CVS 导入的项目。它在其他几十个开发人员 IDE 中工作,但就我而言,它报告了一个问题:

CHKJ3000E: WAR Validation Failed: com.ibm.etools.j2ee.commonarchivecore.exception.DeploymentDescriptorLoadException: WEB-INF/web.xml

谷歌搜索表明它与 Eclipse 加载上下文的方式有关。对于某些用户来说,清理项目是有效的。它不适合我。

关于我接下来可以尝试解决的任何想法?

4

4 回答 4

58

Eclipse > Project Explorer > 右键单击​​出现错误的项目> Validate

在此处输入图像描述

这对我有用!

我对几个项目都有相同的错误消息,并且对每个项目都执行了相同的程序,现在它们都已修复。

相关链接:http: //viralpatel.net/blogs/eclipse-this-project-needs-to-migrate-wtp-metadata/

于 2014-04-22T18:53:20.760 回答
7

这是一个常见的问题,是由于cacheeclipse 维护的。

尝试清除插件缓存并进行全面清理,您也可以删除现有服务器并创建一个新服务器。

有关更多详细信息,请参阅此处,看到人们遇到了类似的问题,清理和删除缓存并重新启动这样的东西已经为他们解决了。

于 2012-10-30T17:21:27.383 回答
3

我发现 >Validate 选项(见上文)仅在下一次构建之前有效。作为构建的一部分的验证很可能存在问题(对于 Web 项目),而验证自己的工作正常。

为了解决这个问题,这以一致的方式对我有用:

项目 > 属性 > 验证:Web (xxx) 验证器

在这里,禁用 Build,但保留 Manual 启用。

现在,当触发新构建时(例如,当我调用 >Gradle >Refresh Gradle Project 时),该项目不会收到验证错误。

于 2017-12-02T18:38:04.117 回答
2

就像其他人已经提到的那样,当 Gradle 或什至以其他方式刷新项目时,这个错误似乎在使用WAR插件的 Gradle 项目中一遍又一遍地出现,仅仅是因为它已在 Eclipse 之外进行了更改。虽然在 Eclipse 中验证项目是可行的,但这只是一个临时解决方法,直到下一次刷新项目。我已经清理了我能找到的所有缓存和东西,所以怀疑这与这些有什么关系。

查看 Eclipse 中的错误视图,有一个额外的堆栈跟踪可用,使事情更清晰:

org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DeploymentDescriptorLoadException: WEB-INF/web.xml
Stack trace of nested exception:
org.eclipse.jst.j2ee.commonarchivecore.internal.exception.EmptyResourceException: platform:/resource/de.am_soft.sm_mtg.frontend/WEB-INF/web.xml
    at org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil.getRoot(ArchiveUtil.java:442)
    at org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.XmlBasedImportStrategyImpl.primLoadDeploymentDescriptor(XmlBasedImportStrategyImpl.java:42)
    at org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.War22ImportStrategyImpl.loadDeploymentDescriptor(War22ImportStrategyImpl.java:90)
    at org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.War22ImportStrategyImpl.importMetaData(War22ImportStrategyImpl.java:84)
    at org.eclipse.jst.j2ee.commonarchivecore.internal.impl.WARFileImpl.getDeploymentDescriptor(WARFileImpl.java:146)
    at org.eclipse.jst.j2ee.model.internal.validation.WarValidator.validateInJob(WarValidator.java:334)
    at org.eclipse.jst.j2ee.internal.web.validation.UIWarValidator.validateInJob(UIWarValidator.java:113)
    at org.eclipse.wst.validation.internal.operations.ValidatorJob.run(ValidatorJob.java:78)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

platform:/resourceEclipse记录如下:

它用于标识位于工作区中的资源。“资源”之后的下一个路径段应该是项目的名称,后面可以是我们要定位的文件夹和/或文件。

因此,出于某种原因,验证器希望WEB-INF/web.xml在 Eclipse 项目的根目录中可用,这对我来说没有多大意义:它过去从未存在过,将它放在那里也不能解决错误。相反,Eclipse 记录了 20 个新错误,没有任何额外的消息或堆栈跟踪,即使在删除之后我也无法摆脱这些错误WEB-INF/web.xml,因此恢复了以前的项目状态。

Eclipse 项目的bugtracker中也报告了类似的错误。

!ENTRY org.eclipse.wst.validation 4 0 2007-08-28 12:00:39.515
!MESSAGE 
*** ERROR ***: Tue Aug 28 12:00:39 EDT 2007    org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DeploymentDescriptorLoadException: WEB-INF/web.xml
    Stack trace of nested exception:
    org.eclipse.jst.j2ee.commonarchivecore.internal.exception.EmptyResourceException: platform:/resource/ARBankLogWeb/WebContent/WEB-INF/web.xml

我的项目使用 WAR 插件从原生 Eclipse 迁移到 Gradle,后者允许手动定义web.xml. 所以我尝试了,但也没有改变任何事情:

war
{
    webXml = file('src/main/webapp/WEB-INF/web.xml')
}

因此,无论验证器的问题是针对某些项目设置的,我目前能找到可靠工作的唯一解决方法是在每个项目中禁用它:

禁用网络验证器。

这使得 Eclipse 创建一个本地设置文件,将该设置存储在项目目录中,并且可以像项目的其他部分一样置于版本控制之下。这样,该设置将立即可供项目的所有用户使用。以下是我的情况的示例:

$PROJECT_NAME.settings\org.eclipse.wst.validation.prefs

DELEGATES_PREFERENCE=delegateValidatorList
USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.j2ee.internal.web.validation.UIWarValidator;org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationfalseversion1.2.800.v201904082137

虽然理论上另外存储这些设置与使用 Gradle 的原因相悖,因为它应该能够在为 Eclipse 创建项目时生成这些文件,这是使这些设置可用并且使用 SCM 记录它们的状态而无需实现太多的最简单方法在build.gradle.

对Eclipse-bugtracker中的错误进行投票可能是一个好主意。

于 2020-03-03T11:15:14.727 回答