一部のユーザーが Eclipse から実行するアプリケーションと、jar ファイルを使用して実行するユーザーがいます。
jar 内から実行するときにいくつかのアクションを実行したいのですが、Eclipse から実行するときにそれらを実行したくありません。
現在のアプリケーションがjar内から実行されているかどうかを実行時に知る方法はありますか?
ありがとう!
ディクラ
クラスが JAR ファイルからロードされたかどうかを確認できますFoo.class.getResource("Foo.class")。返された URL が「jar:」で始まるかどうかを確認します。
たとえば、次のプログラムを見てください。
public class Foo {
public static void main(String[] args) {
System.out.println(Foo.class.getResource("Foo.class"));
}
}
ファイル システムからファイルをロードして実行します。
file:/C:/Users/Jon/Test/com/whatever/Foo.class
jar ファイルから実行します。
jar:file:/C:/Users/Jon/Test/foo.jar!/com/whatever/Foo.class
Equinox ランチャーのシステム クラス パス プロパティを確認できます。
if (System.getProperty("java.class.path").contains("org.eclipse.equinox.launcher")) {
System.out.println("You're running inside Eclipse");
}
他にも確認できる可能性のあるプロパティがいくつかあります。これらは Eclipse で を通じて見つけることができますHelp -> About -> Configuration Details。
JAR から実行しているのか、一連のクラス ファイルから実行しているのかを知りたい場合は、Jon の回答が適切です。ただし、両方のケースで JAR を使用すると、必要なものがわかりません。
ハウツーから
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);
}
}
あげる:
>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
Hosam Alyが指摘したように、これは質問に正確には答えません。
ウィキの回答として、一般的な参照のためにそこに残します。
ファイル名を照会するJARと、ファイルから実行している場合は機能します。JARそうでない場合は、次のようなコードが返されるclassesため、次のコードを使用できます。
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");
}
}
編集:
より正確で、ファイル拡張子の名前変更に抵抗する必要がある場合は、ファイルに含まれているかどうかを確認してMANIFEST.MFください。
public static boolean runningFromJAR()
{
try
{
String jarFilePath = new File(JarUtilities.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;
}
}
通常から、または 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();
}
}
jar に入れて実行するには、次のようにします。
jar cf test.jar TestApplet.class
java -cp test.jar TestApplet
もう 1 つのアプローチは、情報をマニフェスト ファイルに入れ、その情報が実行時に利用可能かどうかをテストすることです。
そうである場合、コードは「-jar」で開始されています。それ以外の場合は、Eclipse から直接など、別の方法で開始されました。
あなたは試すことができます:
boolean inJar = false;
try
{
CodeSource cs = DataResolver.class.getProtectionDomain().getCodeSource();
inJar = cs.getLocation().toURI().getPath().endsWith(".jar");
}
catch (URISyntaxException e)
{
e.printStackTrace();
}
jar ファイルから実行している場合、 cs.getLocation().toURI() はそのファイルの URI を提供します。Eclipse 内から実行している場合は、おそらくクラス ファイルを含むディレクトリへのパスになります。