0

ClassPathResource.getFile()はFileNotFoundExceptionをスローします。コードスニペットは次のとおりです。

    ClassPathResource emsInitResource = new ClassPathResource("ems-init.properties");
    Properties props = loadProps(emsInitResource.getFile());
    logger.info("found 'ems-init.properties' on classpath, processing...");
    emsHome = props.getProperty("ems.home");
    if (emsHome != null) {
        logger.info("'ems.home' property initialized from 'ems-init.properties' as '" + emsHome + "'");
    }
    FilenameFilter ff = new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.startsWith("messages_") && name.endsWith(".properties");
        }
    };
    File[] messagePropsFiles = emsInitResource.getFile().getParentFile().listFiles(ff);
    String locales = "en";
    for (File f : messagePropsFiles) {
        int endIndex = f.getName().indexOf('.');
        String localeCode = f.getName().substring(9, endIndex);
        locales += "," + localeCode;
    }
    logger.info("locales available configured are '" + locales + "'");
    props.setProperty("ems.locales", locales);

そして例外は:

9:38:04,902 INFO  [STDOUT] Caused by: java.io.FileNotFoundException: class path resource [ems-init.properties] cannot be resolved to absolute file path because it does not reside in the file system: vfs:/home/tanmoy/JBoss/jboss-as-distribution-6.0.0.Final/server/default/deploy/EMS.war/WEB-INF/classes/ems-init.properties
19:38:04,902 INFO  [STDOUT]     at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:201)
19:38:04,902 INFO  [STDOUT]     at org.springframework.core.io.ClassPathResource.getFile(ClassPathResource.java:175)
19:38:04,902 INFO  [STDOUT]     at info.ems.config.EMSConfigurer.configureEMS(EMSConfigurer.java:45)
19:38:04,902 INFO  [STDOUT]     at info.ems.config.EMSConfigurer.postProcessBeanFactory(EMSConfigurer.java:34)

しかし、WARには/WEB-INF/classes/ems-init.propertiesが存在します。どうすればこの問題を解決できますか?ありがとうございました。

4

3 に答える 3

1

WARファイルを解凍するようにWebアプリケーションコンテナを設定する必要があります。Fileアーカイブファイル内のメンバーを表すことはできません。

于 2011-05-01T14:29:16.783 に答える
1

このClassPathResource.getInputStream()メソッドを使用して入力ストリームを取得し、を変更しloadPropsてInputStreamからプロパティをロードできます(http://download.oracle.com/javase/1.4.2/docs/api/java/util/Properties.htmlを参照)。 #load(java.io.InputStream))。

これを機能させるためにアーカイブを解凍する必要はありません。

于 2011-05-01T14:41:22.110 に答える
1

さて、解決策は:

    String emsHome = null;
    ClassPathResource emsInitResource = new ClassPathResource("ems-init.properties");
    Properties properties = loadProps(emsInitResource.getInputStream());
    logger.info("found 'ems-init.properties' on classpath, processing...");
    emsHome = properties.getProperty("ems.home");
    if (emsHome != null) {
        logger.info("'ems.home' property initialized from 'ems-init.properties' as '" + emsHome + "'");
    }
    //=================================================================================================
    FilenameFilter filenameFilter = new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.startsWith("messages_") && name.endsWith(".properties");
        }
    };
    URL emsInitUrl = this.getClass().getClassLoader().getResource("ems-init.properties");
    emsInitUrl.openConnection();
    VirtualFile emsInitVirtualFile = (VirtualFile) emsInitUrl.getContent();
    File emsInitFile = emsInitVirtualFile.getPhysicalFile();        
    File[] messagePropertiesFiles = emsInitFile.getParentFile().listFiles(filenameFilter);
    String locales = "en";
    for (File file : messagePropertiesFiles) {
        int endIndex = file.getName().indexOf('.');
        String localeCode = file.getName().substring(9, endIndex);
        locales += "," + localeCode;
    }
    logger.info("locales available configured are '" + locales + "'");
    properties.setProperty("ems.locales", locales);
于 2011-05-01T17:18:45.840 に答える