就像其他人已经提到的那样,当 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:/resource
Eclipse记录如下:
它用于标识位于工作区中的资源。“资源”之后的下一个路径段应该是项目的名称,后面可以是我们要定位的文件夹和/或文件。
因此,出于某种原因,验证器希望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中的错误进行投票可能是一个好主意。