My real question I am in pursuit of answering is this: is it in theory possible to build an automated process that would use jdeps to analyze my app to build a minimal JRE image it would run on? The latter could be done by rewriting rt.jar in Java 8 and using jlink in Java 9.
Sent from my iPhone > On Sep 7, 2016, at 18:34, Waldek Kozaczuk <jwkozac...@gmail.com> wrote: > > Thanks for your responses. > > So today I did some experimentation with Java 8 jdeps to analyze how my > app.jar depends at class level on other jars and eventually individual JRE > classes. I would run following command: > > jdeps -v -P -R -cp lib/* app.jar # where lib/ contains jars that app.jar > depends on to run and libs did not contain app.jar > > It turns our that jdeps would find and present dependent classes in all jars > irregardless if any class in app.jar would directly or indirectly depend on > it per "->" references. > > The good example of it was log4j jar where jdeps showed number of classes > that depend directly or indirectly on some java.awt.* or javax.swing.* > classes. And I am sure that this app does not requires AWT nor Swing to > execute. Is it because jdeps finds individual class dependencies by detecting > reflection calls in bytecode of log4j? > > Or maybe this "greedy" behavior of jdeps is intende and I would need to build > a tool that would process its generated dependency graph starting from > app.jar and that way find the real subset of JRE it depends on? I am still > thinking that jdeps would not be able to show me classes that were called > through java.lang.reflect.* constructs or Class.forName(). > > Do my findings make sense? > >> On Wed, Sep 7, 2016 at 5:03 PM, Mandy Chung <mandy.ch...@oracle.com> wrote: >> >> > On Sep 7, 2016, at 8:07 AM, Sander Mak <sander....@luminis.eu> wrote: >> > >> > >> >> On 07 Sep 2016, at 16:12, Waldek Kozaczuk <jwkozac...@gmail.com> wrote: >> >> >> >> Will I be able to take advantage of jlink's ability to produce subset-only >> >> image of the JRE even if I do not use new Java 9 modular jars? In other >> >> words if my app.jar and other dependent jars are old java 8 ones and do >> >> not >> >> have any module descriptors will jlink be able to identify only needed JRE >> >> modules and produce minimal runtime image? >> > >> > Jlink will not be able to do that for you without module descriptors, but >> > there's an alternative solution. First, use jdeps to find all the platform >> > modules your application needs. Then create an image using jlink with an >> > --add-modules <platform_module> argument for each of the identified >> > platform modules. You can then run your existing application with all >> > application/library JARs on the classpath on top of the resulting image. >> >> As Sander said, jlink creates custom image from packaged modules only. You >> can create a minimal runtime image and your application and other libraries >> can be put on the classpath. >> >> The open issue of adding link-time support for automatic modules is >> JDK-8139947 [1]. >> >> Mandy >> [1] https://bugs.openjdk.java.net/browse/JDK-8130047 >