¿Hay alguna forma de que pueda leer el contenido de un archivo jar? como si quisiera leer el archivo de manifiesto para encontrar el creador del archivo jar y la versión. ¿Hay alguna forma de lograr lo mismo?leyendo el archivo MANIFEST.MF del archivo jar usando JAVA
Respuesta
código siguiente debería ayudar:. Manejo
JarInputStream jarStream = new JarInputStream(stream);
Manifest mf = jarStream.getManifest();
Excepción se deja para ti :)
Usted podría utilizar algo como esto:
public static String getManifestInfo() {
Enumeration resEnum;
try {
resEnum = Thread.currentThread().getContextClassLoader().getResources(JarFile.MANIFEST_NAME);
while (resEnum.hasMoreElements()) {
try {
URL url = (URL)resEnum.nextElement();
InputStream is = url.openStream();
if (is != null) {
Manifest manifest = new Manifest(is);
Attributes mainAttribs = manifest.getMainAttributes();
String version = mainAttribs.getValue("Implementation-Version");
if(version != null) {
return version;
}
}
}
catch (Exception e) {
// Silently ignore wrong manifests on classpath?
}
}
} catch (IOException e1) {
// Silently ignore wrong manifests on classpath?
}
return null;
}
Para obtener los atributos manifiestos, podría iterar sobre la variable "mainAttribs" o directamente recuperar su atributo necesario si se conoce la clave.
Este código recorre cada jar en el classpath y lee el MANIFEST de cada uno. Si conoce el nombre de la jarra es posible que desee más que mirar a la URL si contiene() el nombre de la jarra está interesado en
puede utilizar una clase de utilidad de Manifests
jcabi-manifests:
final String value = Manifests.read("My-Version");
La clase encontrarán toda MANIFEST.MF
archivos disponibles en classpath y lea el atributo que está buscando de uno de ellos. Además, lea esto: http://www.yegor256.com/2014/07/03/how-to-read-manifest-mf.html
Esto es genial y funciona bien. Es bueno que sea una biblioteca. Lo que lo haría mejor es si todos los Manifiestos fueran leídos. Puedo tener el Javadoc tiene una entrada '()', que puede ser lo que yo he sugerido, sin embargo, que el método no aparece en la versión que estoy usando (1.1 - la última en esta fecha en MvnRepository). La respuesta http://stackoverflow.com/a/3777116/1019307 tiene la solución que funcionó para recuperar todos los Manifiestos. – HankCa
he implementado una clase AppVersion acuerdo con algunas ideas de stackoverflow, aquí acabo de compartir la clase entera:
import java.io.File;
import java.net.URL;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AppVersion {
private static final Logger log = LoggerFactory.getLogger(AppVersion.class);
private static String version;
public static String get() {
if (StringUtils.isBlank(version)) {
Class<?> clazz = AppVersion.class;
String className = clazz.getSimpleName() + ".class";
String classPath = clazz.getResource(className).toString();
if (!classPath.startsWith("jar")) {
// Class not from JAR
String relativePath = clazz.getName().replace('.', File.separatorChar) + ".class";
String classFolder = classPath.substring(0, classPath.length() - relativePath.length() - 1);
String manifestPath = classFolder + "/META-INF/MANIFEST.MF";
log.debug("manifestPath={}", manifestPath);
version = readVersionFrom(manifestPath);
} else {
String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + "/META-INF/MANIFEST.MF";
log.debug("manifestPath={}", manifestPath);
version = readVersionFrom(manifestPath);
}
}
return version;
}
private static String readVersionFrom(String manifestPath) {
Manifest manifest = null;
try {
manifest = new Manifest(new URL(manifestPath).openStream());
Attributes attrs = manifest.getMainAttributes();
String implementationVersion = attrs.getValue("Implementation-Version");
implementationVersion = StringUtils.replace(implementationVersion, "-SNAPSHOT", "");
log.debug("Read Implementation-Version: {}", implementationVersion);
String implementationBuild = attrs.getValue("Implementation-Build");
log.debug("Read Implementation-Build: {}", implementationBuild);
String version = implementationVersion;
if (StringUtils.isNotBlank(implementationBuild)) {
version = StringUtils.join(new String[] { implementationVersion, implementationBuild }, '.');
}
return version;
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return StringUtils.EMPTY;
}
}
Básicamente, esta clase puede leer información de la versión del manifiesto de su propio archivo JAR, o el manifiesto en su carpeta de clases. Y afortunadamente funciona en diferentes plataformas, pero solo lo probé en Mac OS X hasta el momento.
Espero que esto sea útil para otra persona.
El único problema con esto es la línea que contiene: String = manifestPath StringUtils.join [...] El uso de File.separatorChar parece generar una URL no válida en Windows ... probablemente mejor usar "/" en su lugar. –
Gracias por señalar esto. Lo intentaré y lo modificaré. –
Waw, es trabajo.¡Gracias! –
Yo sugeriría hacer lo siguiente:
Package aPackage = MyClassName.class.getPackage();
String implementationVersion = aPackage.getImplementationVersion();
String implementationVendor = aPackage.getImplementationVendor();
Dónde MyClassName puede ser cualquier clase de su solicitud por escrito por usted.
Esto es lo que necesito (para leer 'Implementation-Version'). Lamentablemente, esto no funcionó para mí en las clases desempaquetadas, aunque el manifiesto se encuentra en 'META-INF/MANIFEST.MF'. –
Esto no funciona de manera predeterminada a menos que agregue addDefaultImplementationEntries a true para maven-jar-plugin para que realmente tenga información de versión en él. Por defecto, el archivo Manifest no incluye nada. También @Victor, intente ejecutar el paquete mvn y vea el interior si tiene la información adecuada. En general, la configuración de la versión está en maven-jar-plugin o maven-war-plugin, por lo que las clases no empaquetadas no la tienen. – wonhee
Hazlo simple. Un JAR
es también un ZIP
por lo que cualquier código ZIP
se puede utilizar para leer el MAINFEST.MF
:
public static String readManifest(String sourceJARFile) throws IOException
{
ZipFile zipFile = new ZipFile(sourceJARFile);
Enumeration entries = zipFile.entries();
while (entries.hasMoreElements())
{
ZipEntry zipEntry = (ZipEntry) entries.nextElement();
if (zipEntry.getName().equals("META-INF/MANIFEST.MF"))
{
return toString(zipFile.getInputStream(zipEntry));
}
}
throw new IllegalStateException("Manifest not found");
}
private static String toString(InputStream inputStream) throws IOException
{
StringBuilder stringBuilder = new StringBuilder();
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)))
{
String line;
while ((line = bufferedReader.readLine()) != null)
{
stringBuilder.append(line);
stringBuilder.append(System.lineSeparator());
}
}
return stringBuilder.toString().trim() + System.lineSeparator();
}
A pesar de la flexibilidad, por sólo lectura de datos this respuesta es la mejor.
- 1. Cómo leer el archivo MANIFEST.MF del JAR usando Bash
- 2. Leyendo un archivo usando el escáner Java
- 3. Convenciones para contenido adicional del archivo manifest.mf?
- 4. programa Clojure leyendo su propio MANIFEST.MF
- 5. Usando el archivo Java JAR en .NET
- 6. Leyendo un archivo zip dentro de un archivo jar
- 7. Android: Leyendo del archivo (Openfileinput)
- 8. Cómo excluir el archivo de propiedades del archivo jar?
- 9. ¿Qué es el uso de MANIFEST.MF en WAR/JAR/EAR?
- 10. ¿Cómo verifico el orden de MANIFEST.MF dentro de jar?
- 11. Reducir el tamaño del archivo jar externo
- 12. Agregar información del vendedor a MANIFEST.MF usando sbt-assembly
- 13. Archivo ejecutable Java de JAR
- 14. convirtiendo el archivo de clase al archivo jar usando C++
- 15. C++, leyendo un archivo usando ifstream
- 16. Java Command Line Jar Archivo
- 17. Leyendo un archivo de texto en java
- 18. Cargando un archivo relacionado con el archivo jar de ejecución
- 19. Modificar Ejecutar el archivo jar
- 20. Crear un archivo jar desde un archivo de Scala
- 21. Actualización del archivo .class en el jar
- 22. Para ver el contenido del archivo .jar
- 23. Ejecutar en el archivo Jar
- 24. Leyendo un archivo .pdb
- 25. Ejecutar archivo .jar desde un programa Java
- 26. Java Desktop.open (archivo f) archivo de referencia dentro de JAR?
- 27. Leer archivo de propiedades fuera del archivo JAR
- 28. manifest.mf se sobreescribe por ecplise durante la exportación jar
- 29. código Java para crear un archivo JAR
- 30. Leyendo el archivo Strings.xml desde el archivo apk
Excelente que esto pasa por todos los Manifiestos. – HankCa