I used the instructions found at Maven - how can I add an arbitrary classpath entry to a jar 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
is defined in jace-runtime.jar
. When I invoke 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 is adding the executable JAR file to the classpath but ignoring Class-Path
. If I invoke java -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test
I get the expected output:
classpath: jace-runtime.jar;peer_example1.jar
Any ideas?
Answering my own question:
Adding arbitrary entries to Class-Path
is fine on its own. The problem arises when you enable JAR indexing using:
<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 at INDEX.LIST for finding classes, not MANIFEST.MF.
Because your entries are missing from INDEX.LIST, they will not be found by the classloader, no matter what the manifest says.
A simple workaround is to disable JAR indexing. I'm not sure how to inject an arbitrary Class-Path
with indexing enabled.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With