Bash kullanarak MANIFEST.MF dosyasını JAR'dan okuma


92

Bash kullanarak MANIFEST.MF maven bildirim dosyasını "some.jar" dan okumam gerekiyor


4
jar dosyaları sadece zip dosyalarıdır.
Graham Clark

Yanıtlar:


158
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q unzip programından ayrıntılı çıktıyı bastırır
  • -c standart çıktıya çıkarılacak

Misal:

$ 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

Alternatif olarak -pyerine kullanabilirsiniz -q -c.

-p dosyaları boruya çıkart (stdout). Dosya verileri dışında hiçbir şey stdout'a gönderilmez ve dosyalar her zaman depolandıkları gibi (dönüştürme yapılmadan) ikili biçimde çıkarılır.


2
Bu iş parçacığının eski olduğunu biliyorum, ancak kimin için endişelenebilir: El kitabında olduğu gibi, -p veya -c kullanarak çıktının çıkarılması çıktıyı ikili biçimde yazdıracaktır. Bu çıktıyı bir şekilde ayrıştırmanız gerekirse (örneğin ilişkilendirilebilir diziye), doğru olması için -aa bağımsız değişkeniyle metin gösterimini zorlamalısınız.
tcigler

19

kullanım unzip:

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

Bu, sessizce ( -q) META-INF / MANIFEST.MF yolunu jar dosyasından (zip formatı kullanılarak sıkıştırılır) stdout ( -c) 'a okuyacaktır . Ardından, 'bu kavanozun ana sınıfı nedir:' gibi soruları yanıtlamak için çıktıyı başka bir komuta aktarabilirsiniz.

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

(bu, dizeyi içermeyen tüm satırları kaldırır ve Main-Classardından satırı böler, :yalnızca ikinci alanı, sınıf adını korur). Elbette, ya $JARFILE_PATHuygun şekilde tanımlayın ya da $JARFILE_PATHilgilendiğiniz bir jar dosyasına giden yolu değiştirin .


4

Dağıtımınıza bağlı olarak unzippaketi kurun . O zaman basitçe yayınlayın

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

Bu, içeriği STDOUT'a aktaracaktır.

HTH


1

Diğerleri, grep veya awk ya da ihtiyacınız olan her şeye unzip -p ve piping kullanma hakkında yayın yapıyor. Bu çoğu durumda işe yarasa da, MANIFEST.MF'nin satır başına 72 karakter sınırı nedeniyle, değerleri birden çok satıra bölünmüş anahtarlar için grepping yapıyor olabileceğinizi ve bu nedenle ayrıştırmanın çok zor olacağını belirtmek gerekir. Dosyadan işlenmiş bir değeri gerçekten çekebilen bir CLI aracı görmeyi çok isterim.

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


Oluşturulan anahtar / değer çiftlerini elde etmek ve yazdırmak için Java'nın API'sini kullanan bir Groovy betiği ve onu çağırmak için bash dostu tek satırlık bir yanıt ekledim.
ctrueden

1

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

xçıkarır ve standart Oçıktıya yönlendirir.

Not: GNU tar'da değil, yalnızca bsdtar'da çalışıyor gibi görünüyor.


0

Aşağıdaki Groovy komut dosyası, bildirimi ayrıştırmak için Java'nın API'sini kullanır ve bildirim biçiminin garip satır kırmalarıyla ilgili sorunları önler:

#!/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") }
}

JAR dosyalarını bağımsız değişken olarak iletin:

$ 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

Veya tek satırlık bir adam için çaresizseniz:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.