tipos que libreria existen eventos entre ejemplos diferencia cuál cuantos contenedores contenedor componente java jar

que - swing java ejemplos



¿Puedes decir en tiempo de ejecución si estás ejecutando Java desde dentro de un contenedor? (8)

Otro enfoque es colocar información en el archivo de manifiesto y probar si esa información está disponible en tiempo de ejecución.

Si es así, entonces el código se inició con "-jar". De lo contrario, se inició de otra manera, por ejemplo, directamente desde Eclipse.

Tengo una aplicación que algunos de mis usuarios ejecutan desde Eclipse, y otros la ejecutan utilizando un archivo jar.

Quiero que se realicen algunas acciones cuando se ejecuta desde el contenedor, pero no quiero que terminen cuando se ejecute desde Eclipse.

¿Hay alguna forma de saber en tiempo de ejecución si la aplicación actual se ejecuta desde un contenedor?

¡Gracias!

Dikla


Puede verificar la propiedad de ruta de clase del sistema para el iniciador Equinox:

if (System.getProperty("java.class.path").contains("org.eclipse.equinox.launcher")) { System.out.println("You''re running inside Eclipse"); }

Existen otras propiedades potenciales que puede verificar, que puede encontrar en Eclipse a través de la Help -> About -> Configuration Details .

La respuesta de Jon es buena si quieres saber si estás ejecutando desde un JAR o corriendo desde un grupo de archivos de clase. Pero si usa un JAR en ambos casos, no le dirá lo que necesita.


Tu podrías intentar:

boolean inJar = false; try { CodeSource cs = DataResolver.class.getProtectionDomain().getCodeSource(); inJar = cs.getLocation().toURI().getPath().endsWith(".jar"); } catch (URISyntaxException e) { e.printStackTrace(); }

Si está ejecutando desde un archivo jar, cs.getLocation (). ToURI () le dará el URI de ese archivo; si está ejecutando desde dentro de Eclipse, probablemente será la ruta al directorio que contiene sus archivos de clase.


Bueno, puedes ver si una clase ha sido cargada desde un Foo.class.getResource("Foo.class") : usa Foo.class.getResource("Foo.class") y verifica si la URL devuelta comienza con "jar:"

Por ejemplo, toma este programa:

paquete com.whatever;

public class Foo { public static void main(String[] args) { System.out.println(Foo.class.getResource("Foo.class")); } }

Ejecutarlo cargando el archivo desde el sistema de archivos:

file:/C:/Users/Jon/Test/com/whatever/Foo.class

Ejecutarlo desde un archivo jar:

jar:file:/C:/Users/Jon/Test/foo.jar!/com/whatever/Foo.class


Aquí hay un código que puede ejecutar desde normalmente o como jar.

import java.applet.Applet; import java.net.URL; import java.security.CodeSource; public class TestApplet extends Applet { public TestApplet(){ URL path = TestApplet.class.getResource("TestApplet.class"); if(path.toString().startsWith("jar:")) System.out.println("I''m in a jar"); else System.out.println("I''m not in a jar"); } public static void main(String args[]) throws Exception{ new TestApplet(); } }

Para ponerlo en un jar y ejecutarlo, usa lo siguiente:

jar cf test.jar TestApplet.class java -cp test.jar TestApplet


De cómo hacerlo

package com.rgagnon; public class HelloClass { public static void main(String[] args) { new HelloClass().say(); } public void say() { String className = this.getClass().getName().replace(''.'', ''/''); String classJar = this.getClass().getResource("/" + className + ".class").toString(); if (classJar.startsWith("jar:")) { System.out.println("*** running from jar!"); } System.out.println(classJar); } }

Daré:

>jar cvfm Hello.jar manifest.mft com/rgagnon/HelloClass.class added manifest adding: com/rgagnon/HelloClass.class (in=1059) (out=601) (deflated 43%) >java com.rgagnon.HelloClass file:/C:/DEV/WORK/JAVA/com/rgagnon/HelloClass.class >java -jar Hello.jar *** running from jar! jar:file:/C:/DEV/WORK/JAVA/Hello.jar!/com/rgagnon/HelloClass.class

Como señaló Hosam Aly , esto no responde exactamente la pregunta.
Lo dejo allí para referencia general, como una respuesta wiki.


Si consulta el nombre del archivo JAR , funcionará si se ejecuta desde un archivo JAR contrario, devolverá algo así como classes para que se pueda usar el siguiente código:

import java.io.File; public class JarUtilities { public static String getJarName() { return new File(JarUtilities.class.getProtectionDomain() .getCodeSource() .getLocation() .getPath()) .getName(); } public static boolean runningFromJar() { return getJarName().contains(".jar"); } }

EDITAR:
Si necesita más precisión y es resistente al cambio de nombre de la extensión de archivo, comprobar si el archivo contiene MANIFEST.MF debería funcionar:

public static boolean runningFromJAR() { try { String jarFilePath = new File(ProgramDirectoryUtilities.class.getProtectionDomain() .getCodeSource() .getLocation() .getPath()). toString(); jarFilePath = URLDecoder.decode(jarFilePath, "UTF-8"); try (ZipFile zipFile = new ZipFile(jarFilePath)) { ZipEntry zipEntry = zipFile.getEntry("META-INF/MANIFEST.MF"); return zipEntry != null; } } catch (Exception exception) { return false; } }


Tengo dos mejores soluciones. primero:

URL url = this.getClass().getClassLoader().getResource("input.txt"); URLConnection urlConnection = url.openConnection(); if (urlConnection instanceof JarURLConnection) { // run in jar } else { // run in ide }

segundo:

String protocol = this.getClass().getResource("").getProtocol(); if(Objects.equals(protocol, "jar")){ // run in jar } else if(Objects.equals(protocol, "file")) { // run in ide }