Question

ClassPathResource.getFile() throws FileNotFoundException. Here is the code snippet :

    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);

And the exception is :

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)

But in the WAR the /WEB-INF/classes/ems-init.properties is present. How can I solve this problem? Thank you.

Was it helpful?

Solution

You can use the ClassPathResource.getInputStream() method to obtain an input stream and change the loadProps to load the properties from an InputStream (see the http://download.oracle.com/javase/1.4.2/docs/api/java/util/Properties.html#load(java.io.InputStream) ).

You don't need to unpack the archive for this to work.

OTHER TIPS

You need to configure your webapp container to unpack the WAR file. A File cannot represent a member within an archive file.

Okay, the solution is :

    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);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top