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
}