बैश का उपयोग करके JAR से MANIFEST.MF फ़ाइल कैसे पढ़ें


92

मुझे बैश का उपयोग करके "some.jar" से मैनिफेस्ट.एमएफ मेवेन मेनिफेस्ट फाइल पढ़ने की जरूरत है


4
जार फाइलें सिर्फ ज़िप फाइलें हैं।
ग्राहम क्लार्क

जवाबों:


157
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q अनज़िप प्रोग्राम से वर्बोज़ आउटपुट को दबाएगा
  • -c स्टडआउट के लिए निकालेंगे

उदाहरण:

$ 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

वैकल्पिक रूप से आप -pइसके बजाय उपयोग कर सकते हैं -q -c

पाइप (stdout) के लिए -p निकालने की फ़ाइलें। कुछ भी नहीं लेकिन फ़ाइल डेटा को स्टडआउट के लिए भेजा जाता है, और फाइलें हमेशा द्विआधारी प्रारूप में निकाली जाती हैं, जैसे कि वे संग्रहीत हैं (कोई वार्तालाप नहीं)।


2
मुझे पता है कि यह धागा पुराना है, लेकिन जिनके लिए यह चिंता का विषय हो सकता है: मैनुअल से, -p या -c का उपयोग करके बाइनरी फॉर्म में आउटपुट प्रिंट करेगा। यदि आपको किसी तरह इस आउटपुट को पार्स करने की आवश्यकता है (उदाहरण के लिए साहचर्य सरणी के लिए), तो आपको इसे सही करने के लिए -a तर्क के साथ पाठ प्रतिनिधित्व को बाध्य करना चाहिए।
tcigler

19

उपयोग unzip:

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

वह चुपचाप ( -q) जोराफाइल (जो ज़िप प्रारूप का उपयोग कर संकुचित है) से stdout करने के लिए (META-INF / MANIFEST.MF पथ को पढ़ें -c)। फिर आप अन्य कमांड के लिए आउटपुट को पाइप कर सकते हैं जैसे कि 'इस जार के लिए मुख्य वर्ग क्या है: "

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

(यह उन सभी लाइनों को हटा देता है जिनमें स्ट्रिंग नहीं होती है Main-Class, फिर :केवल दूसरी फ़ील्ड, वर्ग नाम रखते हुए लाइन को विभाजित करता है )। बेशक, या तो $JARFILE_PATHउचित रूप से परिभाषित करें या $JARFILE_PATHजिस मार्ग में आपकी रुचि हो, उस मार्ग से प्रतिस्थापित करें।


4

अपने वितरण के आधार पर, स्थापित करें unzip पैकेज । फिर बस मुद्दा

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

यह सामग्री को STDOUT में डंप कर देगा।

HTH


1

अन्य लोग unzip -p का उपयोग करने और grep या awk या जो कुछ भी आप की जरूरत है, के लिए पाइपिंग के बारे में पोस्ट कर रहे हैं। हालांकि यह अधिकांश मामलों के लिए काम करता है, यह ध्यान देने योग्य है कि MANIFEST.MF की 72 वर्ण-प्रति-पंक्ति सीमा के कारण, आप उन कुंजियों के लिए तैयार हो सकते हैं जिनके मान कई रेखाओं में विभाजित हैं और इसलिए पार्स करना बहुत कठिन होगा। मैं एक सीएलआई उपकरण देखना पसंद करूंगा जो वास्तव में फ़ाइल से प्रदान किए गए मूल्य को खींच सकता है।

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


मैंने एक ग्रूवी स्क्रिप्ट के साथ एक उत्तर जोड़ा, जो प्रदान की गई कुंजी / मूल्य जोड़े को प्राप्त करने और प्रिंट करने के लिए जावा के एपीआई का उपयोग करता है, साथ ही इसे लागू करने के लिए एक बैश-अनुकूल वन-लाइनर भी।
ctrueden

1

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

xअर्क और Ostdout को पुनर्निर्देशित करता है।

नोट: केवल bsdtar में काम करने के लिए, GNU टार नहीं।


0

निम्न Groovy स्क्रिप्ट प्रकट स्वरूप को अजीब लाइन ब्रेकिंग के साथ मुद्दों से बचने के लिए, जावा को प्रकट करने के लिए जावा एपीआई का उपयोग करता है:

#!/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 फ़ाइलों को तर्क के रूप में पास करें:

$ 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

या यदि आप एक-लाइनर के लिए बेताब हैं:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.