【问题标题】:Read a file from Tomcat webapps on different Tomcats从不同 Tomcat 上的 Tomcat webapps 读取文件
【发布时间】:2014-01-13 16:52:49
【问题描述】:

考虑以下几点: 我有一个 csv 文件。此文件存储在 tomcat wepapps 目录中。此目录的路径取决于所使用的计算机。有些用户为他们的 Tomcat 使用不同的位置并使用不同的名称。我想实现以下目标。

通过 Spring,我做了以下事情: 我得到了一个将一些数据从 csv 导入数据库的操作。

<bean id="setCsvPathAction" class="custom.action.importcsv.SetCsvPathAction">
   <property name="csvPath" value="C:/temp/test.csv"/>
</bean>

这对我来说很好。为了让其他人更容易配置这条路径,我得到了一个 system.properties 文件。使用此文件,您可以轻松覆盖属性:

setCsvPathAction.csvPath=#{tomcat_home}/webapps/test.csv

这就是我想要的。我希望路径位于 Tomcat webapps 目录中。以上不起作用。你有任何提示如何实现这一点吗?

【问题讨论】:

    标签: java spring tomcat csv


    【解决方案1】:

    大多数使用 tomcat 的人都会设置 CATALINA_HOME 环境变量。您可以查询此环境变量并检索值。

    String tomcat_home = System.getenv("CATALINA_HOME");
    if(tomcat_home){
        setCsvPathAction.csvPath=tomcat_home+"/webapps/test.csv"
    }
    

    注意:不能保证在每个使用 tomcat 的系统上都设置了此环境变量

    更多关于 getenv() - http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#getenv%28%29

    【讨论】:

    • 我想在 bean 的属性中设置路径。我不会写任何代码。
    • 是的,你可以。您已经在使用属性文件。您可以以编程方式添加到属性文件。在应用初始化时执行此操作。
    • 我认为你们两个理解我的方式并不正确。我会将产品交付给客户。我不希望他设置他的 webapps 文件夹的路径。这就是为什么我为他这样做并在属性文件中写入路径。如果他确实想更改路径,他只需要在 .properties 文件中进行配置。这就是为什么我不能以编程方式设置它。如果我可以在 .properties 文件中写类似:“setCsvPathAction.csvPath=#{tomcat_home}/webapps/test.csv”,那就太棒了。
    【解决方案2】:

    如果它位于 web 应用程序文件夹中,您也可以只使用类加载器来获取本地路径,这样您就不必进行任何配置。

    someObject.getClass().getClassLoader().getResourceAsStream("path/refferenced/to/app/root/");

    【讨论】:

    • 我想在 bean 的属性中设置路径。我不会写任何代码。
    • 这就是我要说的。您不需要以这种方式设置任何内容。您必须进行配置是少了一件事情。由于从示例中它是您的 bean,您可以更改它以从 ClassLoader 获取路径位置,而不必配置它。
    • 我想我明白你的意思了。我做了以下事情: this.getClass().getClassLoader().getResourceAsStream("/" + m_csvPath));其中 m_csvPath 是通过 SpringInjection 设置的 csvFile 的名称。可悲的是,我得到了 NullPointerException。
    【解决方案3】:

    .properties 文件的解决方案是:${catalina.home} 接下来我需要一个独立于系统环境的 FileInputStream。我尝试了以下方法:

    public class environmentTest {
    
        public static void main(final String[] args) {
            System.out.println(System.getenv("CATALINA_BASE"));
        }
    
    }
    

    null 打印在控制台上。

    Person 类包含 jpg 文件的名称。此文件位于 webapps 文件夹中。我希望路径独立于所使用的计算机。我尝试了以下方法:

    File file = new File(System.getenv("CATALINA_HOME") + "/webapps/" + person.getPhoto());
    FileInputStream fileInputStream = new FileInputStream(file);
    

    遗憾的是,这不起作用,因为正如 unekwu 所说,并非在所有系统上都设置了此环境变量。你知道我在这种情况下能做什么吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 2012-10-28
      • 2012-07-12
      • 2016-03-10
      • 2018-02-24
      • 1970-01-01
      • 2021-06-12
      • 2019-08-11
      相关资源
      最近更新 更多