K
Karsten Wutzke
Hi all!
I have an application bundled like this (one single JAR containing
library JAR's):
myapp.jar
+- rootpackage
| +- Main.class
| +...
+- images
+- lib
| +- bcel-5.2.jar
| +- forms-1.1.0.jar
| +- ...
+- ...
When starting up, I create a URL like this:
---------
//the JAR inside the JAR
String strRelativePath = "lib/bcel-5.2.jar";
//determines the class and protocol for the connection, prepend with
"/"
URL url = this.getClass().getResource("/" + strRelativePath);
---------
The URL string of url is "jar:file:/C:/dev/bew/myapp.jar!/lib/
bcel-5.2.jar" which is correct.
Now I'm trying to extract the *sub* (lib) JAR's executing:
---------
//this is the myapp.jar JarFile instance, that is the ENCLOSING,
running app's JAR file
//and not the one requested ("lib/bcel-5.2.jar")!
JarURLConnection juc = (JarURLConnection)url.openConnection(); //
returns connection to *enclosing* JAR
---------
I had expected to get a direct connection to the JAR file inside the
JAR, however the currently running app's JAR file is the connection
target. This is somewhat unexpected! When launching the app directly
from the class files directory with the *same* lib hierarchy and the
classpath containing an entry to the root dir ".", the connection is
made directly to the JAR wanted... (here FileURLConnection with string
"file:/C:/dev/bew/lib/bcel-5.2.jar"") which is the desired behavior...
Now I have to perform a number of steps to extract the JAR manually
with:
---------
JarFile jarEnclosing = juc.getJarFile();
JarEntry je = jarEnclosing.getJarEntry(strRelativePath);
//get input stream of JAR entry and transform to byte array
byte[] uncompressedBytes = new byte[(int)je.getSize()];
DataInputStream dis = new
DataInputStream(jarEnclosing.getInputStream(je));
dis.readFully(uncompressedBytes, 0, uncompressedBytes.length);
dis.close();
....
----------
I now have the plain byte[] of the JAR inside the app JAR, this is ok
so far, but I was wondering if there is a way via JarURLConnection to
get to the sub lib JarFile instance *directly* by dereferencing/
navigating the URL instance somehow so I don't have to go via the
enclosing JAR...?
Karsten
I have an application bundled like this (one single JAR containing
library JAR's):
myapp.jar
+- rootpackage
| +- Main.class
| +...
+- images
+- lib
| +- bcel-5.2.jar
| +- forms-1.1.0.jar
| +- ...
+- ...
When starting up, I create a URL like this:
---------
//the JAR inside the JAR
String strRelativePath = "lib/bcel-5.2.jar";
//determines the class and protocol for the connection, prepend with
"/"
URL url = this.getClass().getResource("/" + strRelativePath);
---------
The URL string of url is "jar:file:/C:/dev/bew/myapp.jar!/lib/
bcel-5.2.jar" which is correct.
Now I'm trying to extract the *sub* (lib) JAR's executing:
---------
//this is the myapp.jar JarFile instance, that is the ENCLOSING,
running app's JAR file
//and not the one requested ("lib/bcel-5.2.jar")!
JarURLConnection juc = (JarURLConnection)url.openConnection(); //
returns connection to *enclosing* JAR
---------
I had expected to get a direct connection to the JAR file inside the
JAR, however the currently running app's JAR file is the connection
target. This is somewhat unexpected! When launching the app directly
from the class files directory with the *same* lib hierarchy and the
classpath containing an entry to the root dir ".", the connection is
made directly to the JAR wanted... (here FileURLConnection with string
"file:/C:/dev/bew/lib/bcel-5.2.jar"") which is the desired behavior...
Now I have to perform a number of steps to extract the JAR manually
with:
---------
JarFile jarEnclosing = juc.getJarFile();
JarEntry je = jarEnclosing.getJarEntry(strRelativePath);
//get input stream of JAR entry and transform to byte array
byte[] uncompressedBytes = new byte[(int)je.getSize()];
DataInputStream dis = new
DataInputStream(jarEnclosing.getInputStream(je));
dis.readFully(uncompressedBytes, 0, uncompressedBytes.length);
dis.close();
....
----------
I now have the plain byte[] of the JAR inside the app JAR, this is ok
so far, but I was wondering if there is a way via JarURLConnection to
get to the sub lib JarFile instance *directly* by dereferencing/
navigating the URL instance somehow so I don't have to go via the
enclosing JAR...?
Karsten