【问题标题】:Tomcat Folder as Classpath?Tomcat文件夹作为类路径?
【发布时间】:2025-11-26 11:00:02
【问题描述】:

我似乎无法解决 Tomcat 的一个非常奇怪的问题。我的问题是 Tomcat 似乎将 Tomcat 文件夹(C:/Program Files/Apache Software Foundation/Tomcat 6)视为类路径。当我将 JAVA_OPTS 设置为引用我的属性文件时,此问题就会生效。

-Ddoiadmin.properties.file=doiadmin.properties

我的类路径 (WEB-INF/classes) 中有属性文件,但是当我启动 Tomcat 时,出现错误:

com.XXXXX.commons.servicecore.ServiceConfigurationException: Could not find main properties file (directly or on classpath): [doiadmin.properties]

让应用程序正确启动的唯一方法是将属性文件放在 Tomcat 文件夹中。这很烦人,从长远来看,这不是我想做的事情。

我搜索了互联网并询问了一些人无济于事。有人有什么建议吗?

感谢您的帮助 -蒂姆

【问题讨论】:

  • 您是否使用 Windows 安装程序进行安装?如果是这样,请检查服务设置(它应该已经安装了控制面板)。尝试只使用从 startup.bat 运行的 ZIP 版本,看看是否可行。您可能还需要检查您的系统环境变量,那里可能存在问题。
  • 感谢您的意见。我使用的是 Windows 安装程序,但我尝试使用 zip 并得到同样的错误。我还添加: -Ddoiadmin.properties.file=doiadmin.properties 到我的系统属性无济于事。
  • 我不确定是什么类导致了这种情况,但它们在你的 webapp 的 jar 或 classes 文件夹中,对吗?它们不在 tomcat/classes 目录中吗?
  • 我也将项目的 lib 文件放入 tomcats lib 文件夹中。这很糟糕吗?
  • 是的,它不会成为您的 webapp 类路径的一部分,而是 tomcat 的“全局”类路径。 Tomcat 使用一组嵌套的类加载器,因此 Tomcat/lib 目录的内容位于父类加载器中,并且它们的类路径将不同于从 webapp 中加载的类。

标签: java spring tomcat web-applications


【解决方案1】:

如果我理解正确,我会这样做:

在你的 web.xml 中有以下内容:

<env-entry>
  <env-entry-name>RootPathPropertyName</env-entry-name>
  <env-entry-type>java.lang.String</env-entry-type>
  <env-entry-value>uk.co.foo.project.path</env-entry-value>
</env-entry>

<env-entry>
  <env-entry-name>RootPathPropertyValue</env-entry-name>
  <env-entry-type>java.lang.String</env-entry-type>
  <env-entry-value>d:/foo/bar</env-entry-value>
</env-entry>

在您的上下文中设置 PlaceHolderConfigurer,如下所示:

<!-- Properties Configuration -->
<bean id="propertyConfigurer"
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="order" value="1"/>
  <property name="locations">
    <list>
      <value>file:${uk.co.foo.project.path}/config/foo.properties</value>
    </list>
  </property>
</bean>

在您的 tomcat 配置中,您可以使用 /conf/Catalina/localhost/foo.xml 文件中的以下内容覆盖默认位置:

<Context path="foo" >
<Environment name="RootPathPropertyValue" value="c:/foo/bar" type="java.lang.String" override="false"/>
</Context>

【讨论】:

    最近更新 更多