loading resources form a jar file

i want to bundle all my resources in a jar file. how do i make that transparent to all my classes that use resources ? now i have classes that load icons refered by their filenames (such as loadIcon(".res/myicon.gif")), and i would like them to work the same when i change my resources from a dir to a jar.
hapciuAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

CEHJCommented:
You can do

new ImageIcon(getClass().getResource("/res/myicon.gif"));
0
CEHJCommented:
Or if you ensure your loadIcon method is overloaded to take a URL as a parameter then you'll also be fine with

loadIcon(getClass().getResource("/res/myicon.gif"));
0
hapciuAuthor Commented:
what is getClass and whom do i call it upon ??
thanks
0
Microsoft Azure 2017

Azure has a changed a lot since it was originally introduce by adding new services and features. Do you know everything you need to about Azure? This course will teach you about the Azure App Service, monitoring and application insights, DevOps, and Team Services.

CEHJCommented:
getClass() is called on the this reference so you should be fine unless there is no 'this' in scope.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
hapciuAuthor Commented:
it kinda works. but getResource gives me an url and i can't make a file / filename out of that url (and that's what i need unfortunately). is it pssible to get a file or filename (or an uri) from an url  ?
0
sciuriwareCommented:
Just use the URL as a filename string because a URL has a .toString() method.
Just check that the URL is not null.
;JOOP!
0
hapciuAuthor Commented:
well, url.toString() or url.getFile() return a string which isn't my file's name, but a full name with protocol, host and everything. if i feed that string to a new File(String name) i get an exception. i guess the only way is to parse that string and extract my filename. but thanks anyways.
0
sciuriwareCommented:
I cut this from one of my applications, why should it not work for you?

   /**
    * Safely get the path to a resource file via Class info.
    * <p>If the file is missing, assuming that the resource was an image file,<BR>
    * the packaged <b>MISSING.gif</b> icon is substituted,
    * using the class info <b>packageClass</b> retrieved elsewhere.</p>
    * @param  classinfo   a Class loaded from the root of relative pathname.
    * @param  filename    the relative pathname to the resource file.
    * @return             an URL to the resulting resource.
    */
   private static URL findResource(Class classInfo, String filename)
   {
   URL resourceURL;

      if(classInfo == null)
      {
         fatal("BAD CLASS INFO");
      }

      if((resourceURL = classInfo.getResource(filename)) == null)
      {
         error("RESOURCE FILE '" + filename + "' MISSING.");
         if((resourceURL
            = packageClass.getResource("res/MISSING.gif")) == null)
         {
            fatal("SUBSTITUTE IMAGE 'MISSING' NOT FOUND.");
         }
      }
      return(resourceURL);
   }


// And deploying this in my program elsewhere (assume JFrame mainFrame;   ):

   /**
    * Set the default icon on the program main JFrame.
    * <p>Can be used to reset the icon after calls with an argument.<BR>
    * The default icon should be <b>res/<program>.gif</b>.</p>
    */
   public static void setMainFrameIcon( )
   {
      mainFrame.setIconImage
      (
         Toolkit.getDefaultToolkit().getImage(findResource(this.getClass( ), "res/Application.gif"))
      );
   }


;JOOP!
0
hapciuAuthor Commented:
that should work, i admit. but i need to open an inputStream on that file (which is not an icon, it's a properties file bundled with my resources) - and inputStream NEEDS a file. so i have to get a File from the url your method returns.
0
CEHJCommented:
InputStream in = getClass().getResourceAsStream("/res/myicon.gif");
0
CEHJCommented:
Sorry, missed this:

>>it's a properties file bundled with my resources

therefore

Properties props = new Properties();
props.load(getClass().getResourceAsStream("/res/myProps.properties"));
0
sciuriwareCommented:
hapciu, next time ask your question right!
You didn't ask for file resources.
Anyway, the last answer by CEHJ is the one that deserves points.
;JOOP!
0
hapciuAuthor Commented:
ok, so i didn't say the whole thing right from the start... :P
sorry for that and thanks for your help, both of you.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.