Java 将属性文件添加到类路径但获取FileNotFoundException

Java 将属性文件添加到类路径但获取FileNotFoundException,java,spring,spring-mvc,classpath,Java,Spring,Spring Mvc,Classpath,我的spring上下文文件包含以下内容: <context:property-placeholder location="classpath:web.properties" /> 我使用以下方式运行我的应用程序: >java -cp "/www/site/configs/*.*" -jar app.war 但我得到了一个例外: java.io.FileNotFoundException: class path resource [web.properties] cannot

我的spring上下文文件包含以下内容:

<context:property-placeholder location="classpath:web.properties" />
我使用以下方式运行我的应用程序:

>java -cp "/www/site/configs/*.*" -jar app.war
但我得到了一个例外:

java.io.FileNotFoundException: class path resource [web.properties] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:157)
    at org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:181)
    at org.springframework.core.io.support.PropertiesLoaderSupport.mergeProperties(PropertiesLoaderSupport.java:161)
    at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:78)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:686)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:661)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
即使我将文件添加到我的类路径中,它仍然找不到它为什么

更新

因此,我的配置文件如下:

/www/site/configs/web.properties
/www/site/configs/log4j.properties
我试过这个:

>/www/site/java -cp ".:app.war:/www/site/configs/*.*" com.abc.server.MyServer
以及:

甚至:

/www/site/java-cp.“:app.war”com.abc.server.MyServer

我得到了同样的错误:

2013-04-25 01:19:28.210:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2013-04-25 01:19:28.294:INFO:oejw.WebInfConfiguration:Extract jar:file:/www/site/app.war!/ to /www/site/work/app
2013-04-25 01:19:32.814:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/www/site/app/},file:/www/site/app.war
log4j:WARN No appenders could be found for logger (org.springframework.web.context.support.StandardServletEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2013-04-25 01:19:33.585:INFO:/:Initializing Spring FrameworkServlet 'app'
2013-04-25 01:19:35.750:WARN:/:unavailable
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in ServletContext resource [/WEB-INF/web-context.xml]: Could not resolve placeholder 'dataSource.url' in string value [${dataSource.url}]
    at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:209)
My web.properties具有:

dataSource.url=jdbc:mysql://localhost/appdb
dataSource.username=root
dataSource.password=123
同样,我的web-context.xml文件具有:

..
 <context:property-placeholder location="classpath*:/web.properties" />

    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="${dataSource.url}"/>
        <property name="username" value="${dataSource.username}"/>
        <property name="password" value="${dataSource.password}"/>
..
。。
..
我还尝试了以下变化:

<context:property-placeholder location="classpath:web.properties" />
<context:property-placeholder location="classpath*:web.properties" />
<context:property-placeholder location="classpath*:/web.properties" />

我也遇到过类似的问题。我不能说为什么,但我发现-cp参数在与-jar一起使用时不起作用

你可以用

编辑

根据讨论和经历:

正确的语法应为:

在windows中:

java -cp "app.war;/www/site/configs/" <Main Class file name>
java-cp“app.war;/www/site/configs/”
在Linux中:

java -cp "app.war:/www/site/configs/" <Main Class file name>
java-cp“app.war:/www/site/configs/”
  • 通过类路径访问的项根本不一定是文件。它们可能仍在JAR或WAR文件中。应该通过Class.getResource()和friends将它们作为资源访问

  • 类路径中的条目也不是文件。根据包结构,类路径是一个或多个目录或JAR文件,在其中可以找到资源


  • 我的web.properties文件仍然存在文件未找到错误。在spring配置中也更改为:classpath*:web.properties,同时我将创建一个示例应用程序来测试刚刚测试了本地设置,它工作正常。我将包含属性文件的文件夹添加到classpath中,并对其进行了测试,spring也检测到了同样的情况。原因在文档中。它特别指出,如果使用-jar选项,-cp参数将被忽略。为什么不删除答案中错误的部分并保留正确的部分呢?没有人对历史感兴趣,如果他们对历史感兴趣,他们可以阅读编辑内容。不,除非我跟着你,如果我把log4j.properties放在类路径上,spring不会接受它,因为它不在resources文件夹中吗?我想我可以轻松地交换.properties文件,但只需将它们添加到我的类路径中即可。好的,类路径不包含文件名。它包含位于包结构头部的目录名或JAR文件名。在类路径中命名属性文件根本不会将其添加到类路径中。这是否意味着我应该这样做:“/www/site/conf/*.*”@EJP这里有一个问题:如果我执行的命令是:java-cp“app.war;/www/site/configs/*.*”,这意味着/www/site/configs所有文件都包含在类路径中。解析一个资源,比如:在spring中,应该将它解析为一个资源。我说得对吗?@HimanshuBhardwaj不,你说得不对。我刚才已经解释过了。同样:类路径是一个或多个目录或JAR文件。不是一组文件名。
    <context:property-placeholder location="classpath:web.properties" />
    <context:property-placeholder location="classpath*:web.properties" />
    <context:property-placeholder location="classpath*:/web.properties" />
    
    java -cp "app.war;/www/site/configs/" <Main Class file name>
    
    java -cp "app.war:/www/site/configs/" <Main Class file name>