Executable JAR ignores its own Class-Path attribute

I used the instructions found in Maven - how can I add an arbitrary entry to the Class-Path path to the bank to add an arbitrary entry to the Class-Path attribute. Here is my MANIFEST.MF file:

 Manifest-Version: 1.0 Class-Path: jace-runtime.jar Main-Class: org.jace.examples.Test 

I defined org.jace.examples.Test as follows:

 public class Test { public static void main(String[] args) { System.out.println("classpath: " + System.getProperty("java.class.path")); System.out.println("PeerExample: " + Class.forName("org.jace.util.ShutdownHook")); } } 

where org.jace.util.ShutdownHook defined in jace-runtime.jar . When I java -jar peer_example1.jar I get the following output:

classpath: peer_example1.jar Exception in thread "main" java.lang.ClassNotFoundException: org.jace.util.ShutdownHook

In other words, Java adds the JAR executable in Class-Path to classes, but ignores Class-Path to classes. If I java -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test I get the expected result:

classpath: jace-runtime.jar;peer_example1.jar

Any ideas?

+12
java classpath jar
May 03 '12 at 17:34
source share
3 answers

Answering my own question:

  • Adding custom records to Class-Path is fine. The problem occurs when you enable JAR indexing with:

     <configuration> <archive> <index>true</index> </archive> </configuration> 

    Maven will omit your entries from META-INF/INDEX.LIST .

  • When you use the JAR at runtime, Java will look for INDEX.LIST to search for classes, not MANIFEST.MF.

  • Since your entries are not in INDEX.LIST, they will not be found by the class loader, no matter what the manifest says.

A simple workaround is to disable JAR indexing. I'm not sure how to introduce an arbitrary Class-Path with indexing.

+15
May 03 '12 at 18:19
source share

For those who otherwise might not know, the executable archive mechanism takes the manifest class path and uses it to load external classes into the archive.

So, if you expect a WAR with an explicit WEB-INF / classes class class to find the classes in the WEB-INF / classes entry inside , then you will be disappointed.

0
Jan 05 '14 at 23:05
source share

On tooldocs page for jar option - Link to documents

When you use this parameter, the JAR file is the source of all user classes, and other parameters of the user class path are ignored.

-four
May 03 '12 at 17:59
source share



All Articles