简体   繁体   中英

How to Read PNG from a jar packaged in a war

I am trying to write some code that allows me to access a file (specifically EMailBanner.png) that is wrapped as a jar and then included in a war.

The code I have cobbled together is as follows;

public static File getFile(String imagePath){

    if(StringUtilities.stringEmptyOrNull(imagePath)){
        throw new IllegalArgumentException("Invalid image path");
    }

    File tempFile = null;
    InputStream is = null;
    FileOutputStream fos = null;
    try{
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        is = classLoader.getResourceAsStream(imagePath);
        tempFile = File.createTempFile("EMailBanner", ".png"); 
        tempFile.deleteOnExit();  
        fos = new FileOutputStream(tempFile); 
        byte[] buf = new byte[1024];  
        int len;  
        while ((len = is.read(buf)) != -1) {  
            fos.write(buf, 0, len);  
        }
    }catch(IOException e ){
        LOGGER.error("Unable to load image", e);
    }catch(Exception e){
        LOGGER.error("Unable to load image", e);
    }finally{
        try {   
            fos.close();
            is.close();
        } catch (IOException e) {
            LOGGER.warn("Unable to close the file input / file output streams", e);
        }
    }
    return tempFile;
}

The issue I am facing is that when deployed on to the development box as a war file - the application cannot find the png file. If I run locally in eclipse it isn't a problem.

Whats strange is I have a number of properties files in the resources folder as you can see from the image below;

在此处输入图片说明

I have no problems loading those from within the jar file - loaded like this;

public static Properties getDatabaseConnectionProps(ApplicationName appName) throws IOException{

    if(appName == null){
        throw new IllegalArgumentException("Path to proeprties file was null or empty");
    }

    Properties props = null;

    try(InputStream resourceStream = DatabaseUtilities.class.getResourceAsStream("/vimba.properties")) {
        if(resourceStream != null){
            props = new Properties();
            props.load(resourceStream);
            return props;
        }else{
            throw new IllegalArgumentException("In invalid properties file path was provided");
        }
    } catch (IOException e) {
        throw e;
    }
}

So why would one approach work and potentially not the other? I am completely out of alternative options so really hope someone can save the day

Thanks

I have just tested something similar on my local machine using your code. It seems to work fine from what I can see.

The only other issue I can see is - if you check the JAR (you can de-compile it), make sure the image you are trying to retrieve is in there and that the filename matches.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM