【问题标题】:putting external files in eclipse relatively将外部文件相对放置在eclipse中
【发布时间】:2012-07-09 20:49:24
【问题描述】:

我有 src 文件夹,里面有很多包,其中之一是 hibernate.util。

之前我将 hibernate.cfg.xml 放在 src 文件夹中并给出了它的绝对路径,现在因为我必须部署这个应用程序,所以绝对路径给我带来了问题。

我尝试添加一个新的资源文件夹作为源文件夹,将其包含在源文件夹中,将其添加到类路径中,但每次找不到它的文件

我正在使用 Eclipse IDE

SEVERE: Allocate exception for servlet sandbox
java.io.FileNotFoundException: .\resources\hibernate.cfg.xml (The system cannot find the path specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:2216)
    at dal.utils.HibernateUtils.buildSessionFactory(HibernateUtils.java:25)
    at dal.utils.HibernateUtils.<clinit>(HibernateUtils.java:19)
    at dal.service.CalcDataMapper.load(CalcDataMapper.java:17)
    at com.renturduniya.www.sandbox.init(sandbox.java:41)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1206)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:827)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 你能分享一下你是如何给出相对路径的吗?
  • @Patton 我在文件名中提供了 resourceFiles/hibernate.cfg.xml,resourceFiles 是应用程序根目录中的一个新文件夹,我正在使用 eclpise 的 Web 项目

标签: java eclipse


【解决方案1】:

您不应该将文件传递给它。 File 表示文件系统上的路径。您的配置文件应与应用程序的类一起捆绑在 jar/war 中,并使用类加载器进行加载。

您应该改用method taking a URL as argument,并将返回的 URL 传递给它

SomeClassOfYourWebApp.class.getResource(
    "/the/package/where/the/file/is/hibernate.cfg.xml");

【讨论】:

  • 请详细说明我无法理解这一点,你的意思是我应该创建一个新包说“resourceFiles”并将这个配置文件放在那里并在“HibernateUtils.java”中调用它作为 HibernateUtils.class.getResource("资源文件/hibernate.cfg.xml");
  • 是的,除了路径应该以/ 开头,并且您不必创建专用包。
  • 不创建专用包意味着我可以将它放在 src 子文件夹中使用 HibernateUtils.class.getResource("hibernate.cfg.xml");
  • 是,但路径必须以 / 开头。您可以将文件放在根包或任何其他包中,只要用于加载文件的路径与存储文件的包匹配即可。你为什么不阅读Class.getResource()的javadoc?
  • 哈哈,对不起,自从我的项目 1 个月前开始以来,我一直在努力解决这个愚蠢的问题,早些时候我只是硬编码绝对路径,但现在在部署时它吃掉了我,我正在寻找一些东西早上你来了,让我试试你的解决方案
【解决方案2】:

尝试使用像/resources/hibernate.cfg.xml 这样的正斜杠,以防您在 hibernateUtil 类中硬编码了值。如果不尝试做这样的事情

    URL url = hibernateUtil.class.getClassLoader().getResource(
                    "hibernate.cfg.xml");
   // Now try to get the get path of the file using 
    url.getPath();

我认为这对你有帮助。

【讨论】:

    【解决方案3】:

    处理这个问题的最好方法是使用类加载器。

    Whatever.class.getClassLoader().getResource("name");
    

    因为这实际上会考虑到类路径。

    否则,相对路径名将相对于您的工作目录,而不是相对于您的源代码树。

    请注意,在 Eclipse 中,Run Configurations 您在 Arguments 选项卡中有一个名为 Working directory 的设置,默认为您的项目文件夹。对于多个运行配置,您可以使用不同的工作文件夹(这样,您的应用程序可以使用不同的配置)。

    常见的目录布局可能是:

    bin/     compiled classes, in classpath
    src/     source files, not used at runtime
    site1/   configuration for running site 1
    site2/   configuration for running site 2
    

    然后将文件放入:

    site1/resources/hibernate.cfg.xml
    site2/resources/hibernate.cfg.xml
    

    并将工作文件夹设置为site1或site2。

    【讨论】:

      【解决方案4】:

      外部文件总是绝对路径。

      【讨论】:

      • 如果它们在您的工作目录中,则它们不是外部文件
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多