How to read MANIFEST.MF file from JAR using Bash

BashJarmanifest.mf

Bash Problem Overview


I need to read MANIFEST.MF maven manifest file from "some.jar" using bash

Bash Solutions


Solution 1 - Bash

$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q will suppress verbose output from the unzip program
  • -c will extract to stdout

Example:

$ unzip -q -c commons-lang-2.4.jar META-INF/MANIFEST.MF

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 1.5.0_13-119 (Apple Inc.)
Package: org.apache.commons.lang
Extension-Name: commons-lang
Specification-Version: 2.4
Specification-Vendor: Apache Software Foundation
Specification-Title: Commons Lang
Implementation-Version: 2.4
Implementation-Vendor: Apache Software Foundation
Implementation-Title: Commons Lang
Implementation-Vendor-Id: org.apache
X-Compile-Source-JDK: 1.3
X-Compile-Target-JDK: 1.2

Alternatively you can use -p instead of -q -c.

> -p extract files to pipe (stdout). Nothing but the file data is sent to stdout, and the files are always extracted in binary format, just as they are stored (no conversions).

Solution 2 - Bash

use unzip:

$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF

that will quietly (-q) read the path META-INF/MANIFEST.MF from the jarfile (which is compressed using the zip format) to stdout (-c). You can then pipe the output to other command to answer questions like 'what is the main class for this jar:

$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF | grep 'Main-Class' | cut -d ':' -f 2

(this removes all lines which don't contain the string Main-Class, then splits the line at :, keeping only the second field, the class name). Of course, either define $JARFILE_PATH appropriately or replace $JARFILE_PATH with the path to a jarfile you're interested in.

Solution 3 - Bash

Depending on your distribution, install the unzip package. Then simply issue

unzip -p YOUR_FILE.jar META-INF/MANIFEST.MF

This will dump the contents to STDOUT.

HTH

Solution 4 - Bash

$ tar xfO some.jar META-INF/MANIFEST.MF

x extracts and O redirects to stdout.

Note: Seem to work only in bsdtar, not GNU tar.

Solution 5 - Bash

Others have been posting about using unzip -p and piping to grep or awk or whatever you need. While that works for most cases, it's worth noting that because of the 72 characters-per-line limit of MANIFEST.MF, you may be grepping for keys whose values are split across multiple lines and will therefore be very difficult to parse. I'd love to see a CLI tool that can actually pull a rendered value out of the file.

http://delaltctrl.blogspot.com/2009/11/manifestmf-apparently-you-are-just.html

Solution 6 - Bash

The following Groovy script uses Java's API to parse the manifest, avoiding issues with the manifest format's weird line breaking:

#!/usr/bin/env groovy
for (arg in args) {
  println("[$arg]")
  jarPath = new java.io.File(arg).getAbsolutePath()
  jarURL = new java.net.URL("jar:file:" + jarPath + "!/")
  m = jarURL.openConnection().getManifest()
  m.getMainAttributes().each { k, v -> println("$k = $v") }
}

Pass JAR files as arguments:

$ groovy manifest.groovy ~/.m2/repository/junit/junit/4.13/junit-4.13.jar
[/Users/curtis/.m2/repository/junit/junit/4.13/junit-4.13.jar]
Implementation-Title = JUnit
Automatic-Module-Name = junit
Implementation-Version = 4.13
Archiver-Version = Plexus Archiver
Built-By = marc
Implementation-Vendor-Id = junit
Build-Jdk = 1.6.0_65
Created-By = Apache Maven 3.1.1
Implementation-URL = http://junit.org
Manifest-Version = 1.0
Implementation-Vendor = JUnit

Or if you're desperate for a one-liner:

groovy -e 'new java.net.URL("jar:file:" + new java.io.File(args[0]).getAbsolutePath() + "!/").openConnection().getManifest().getMainAttributes().each { k, v -> println("$k = $v") }' ~/.m2/repository/junit/junit/4.13/junit-4.13.jar

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRomanView Question on Stackoverflow
Solution 1 - BashmikuView Answer on Stackoverflow
Solution 2 - BashBobby PowersView Answer on Stackoverflow
Solution 3 - BashZsolt BotykaiView Answer on Stackoverflow
Solution 4 - BashrlovtangView Answer on Stackoverflow
Solution 5 - BashJustin ClaytonView Answer on Stackoverflow
Solution 6 - BashctruedenView Answer on Stackoverflow