-
Notifications
You must be signed in to change notification settings - Fork 41.6k
Closed
Description
When native image is built, there is no MANIFEST.MF for the application being built. Running "MyApp.class.getPackage().getImplementationVersion()" will return "null" in such scenario.
This is expected, as MANIFEST.MF is written by maven-jar-plugin, but native image build operates on target/classes dir itself.
How would one proceed with "get version of the currently running app" when running as native executable?
Consider the following example: https://github.com/krezovic/native-image-demo
@SpringBootApplication
public class DemoApplication {
private static final String VERSION;
static {
VERSION = DemoApplication.class.getPackage().getImplementationVersion();
}
public static void main(String[] args) {
log.info("Running version: {}", VERSION);
SpringApplication.run(DemoApplication.class, args);
}
}
./mvnw clean package -P native
./mvnw native:compile
will produce
$ ls -l target
total 104128
drwxr-xr-x 5 armin armin 4096 Sep 22 13:45 classes
-rwxr-xr-x 1 armin armin 85846072 Sep 22 13:46 demo
-rw-r--r-- 1 armin armin 20596296 Sep 22 13:45 demo-0.0.1-SNAPSHOT.jar
-rw-r--r-- 1 armin armin 137454 Sep 22 13:45 demo-0.0.1-SNAPSHOT.jar.original
drwxr-xr-x 3 armin armin 4096 Sep 22 13:45 generated-sources
drwxr-xr-x 3 armin armin 4096 Sep 22 13:45 generated-test-sources
drwxr-xr-x 3 armin armin 4096 Sep 22 13:45 graalvm-reachability-metadata
drwxr-xr-x 2 armin armin 4096 Sep 22 13:45 maven-archiver
drwxr-xr-x 3 armin armin 4096 Sep 22 13:45 maven-status
drwxr-xr-x 3 armin armin 4096 Sep 22 13:45 spring-aot
drwxr-xr-x 2 armin armin 4096 Sep 22 13:45 surefire-reports
drwxr-xr-x 3 armin armin 4096 Sep 22 13:45 test-classes
drwxr-xr-x 2 armin armin 4096 Sep 22 13:45 test-ids
Running
$ java -jar target/demo-0.0.1-SNAPSHOT.jar
13:47:41.896 [main] INFO com.example.demo.DemoApplication -- Running version: 0.0.1-SNAPSHOT
Running native executable, however
$ target/demo
13:48:04.685 [main] INFO com.example.demo.DemoApplication -- Running version: null
As expected, there's no MANIFEST.MF inside target/classes/META-INF
$ ls -l target/classes/META-INF
total 4
drwxr-xr-x 6 armin armin 4096 Sep 22 13:45 native-image
It is only present inside final JAR file
$ jar -tf target/demo-0.0.1-SNAPSHOT.jar | grep META-INF
META-INF/
META-INF/MANIFEST.MF
META-INF/services/
META-INF/services/java.nio.file.spi.FileSystemProvider
META-INF/native-image/
META-INF/native-image/ch.qos.logback/
META-INF/native-image/ch.qos.logback/logback-classic/
META-INF/native-image/ch.qos.logback/logback-classic/1.5.8/
META-INF/native-image/com.example/
META-INF/native-image/com.example/demo/
META-INF/native-image/com.fasterxml.jackson.core/
META-INF/native-image/com.fasterxml.jackson.core/jackson-databind/
META-INF/native-image/com.fasterxml.jackson.core/jackson-databind/2.17.2/
META-INF/native-image/org.apache.tomcat.embed/
META-INF/native-image/org.apache.tomcat.embed/tomcat-embed-core/
META-INF/native-image/org.apache.tomcat.embed/tomcat-embed-core/10.1.30/
META-INF/maven/
META-INF/maven/com.example/
META-INF/maven/com.example/demo/
META-INF/native-image/ch.qos.logback/logback-classic/1.5.8/reflect-config.json
META-INF/native-image/ch.qos.logback/logback-classic/1.5.8/resource-config.json
META-INF/native-image/com.example/demo/reflect-config.json
META-INF/native-image/com.example/demo/resource-config.json
META-INF/native-image/com.example/demo/native-image.properties
META-INF/native-image/com.fasterxml.jackson.core/jackson-databind/2.17.2/reflect-config.json
META-INF/native-image/org.apache.tomcat.embed/tomcat-embed-core/10.1.30/reflect-config.json
META-INF/native-image/org.apache.tomcat.embed/tomcat-embed-core/10.1.30/resource-config.json
META-INF/maven/com.example/demo/pom.xml
META-INF/maven/com.example/demo/pom.properties
Metadata
Metadata
Assignees
Labels
type: documentationA documentation updateA documentation update