Can you tell on runtime if you're running java from within a jar?

后端 未结 8 1558
星月不相逢
星月不相逢 2020-12-09 14:54

I have an application that some of my users run from Eclipse, and others run it by using a jar file.

I want some actions to be done when running from within the jar,

8条回答
  •  北荒
    北荒 (楼主)
    2020-12-09 15:30

    If you query the JAR file name it will work if running from a JAR file otherwise it will return something like classes so the following code can be used:

    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");
        }
    }
    

    EDIT:

    If you need more accuracy and to be resistant against renaming of the file extension, checking whether the file contains the MANIFEST.MF should work:

    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;
        }
    }
    

提交回复
热议问题