自毁应用程序

时间:2012-04-11 14:28:43

标签: java desktop-application self-destruction

沿着的路线“这个磁带将在五秒内自毁。祝你好运,吉姆” ......

一旦预设的使用时间或其他条件达成,应用程序是否可以删除自身(或它的可执行包装形式)?

或者,可以使用哪些其他方法使应用程序无用?

此处的目标是让测试版过期,邀请用户获取更新版本。

4 个答案:

答案 0 :(得分:8)

有可能。为了解决JAR文件的锁定问题,您的应用程序可能需要生成一个后台进程,该进程在删除内容之前一直等待JVM退出。

然而,这不是防弹的。有人可以安装应用程序,然后将安装的文件和目录设置为只读,这样您的应用程序就无法自行删除。通过操作系统访问控制系统的用户(或其管理员)对创建和删除的文件有最终决定权。

答案 1 :(得分:5)

如果您控制测试人员下载您的应用程序的位置,您可以使用自动构建系统(例如Jenkins),您可以每晚创建一个具有硬编码到期日期的新测试版本:

private static final Date EXPIRY_DATE = <90 days in the future from build date>;

上述日期由构建过程自动插入

if (EXPIRY_DATE.before(new Date()) {
    System.out.println("Get a new beta version, please");
    System.exit(1);
}

将其与signed and sealed jars混合,以便在反编译字节码方面设置障碍并提供不包含该代码的替代实现,您可以分发代码的时间到期beta。

自动构建系统可以配置为自动将测试版上传到托管下载版本的服务器。

答案 2 :(得分:0)

由于Windows在JAR文件运行时将其锁定,因此您无法从自己的Java代码中删除它,因此需要Batch文件:

private static void selfDestructWindowsJARFile() throws Exception
{
    String resourceName = "self-destruct.bat";
    File scriptFile = File.createTempFile(FilenameUtils.getBaseName(resourceName), "." + FilenameUtils.getExtension(resourceName));

    try (FileWriter fileWriter = new FileWriter(scriptFile);
         PrintWriter printWriter = new PrintWriter(fileWriter))
    {
        printWriter.println("taskkill /F /IM \"java.exe\"");
        printWriter.println("DEL /F \"" + ProgramDirectoryUtilities.getCurrentJARFilePath() + "\"");
        printWriter.println("start /b \"\" cmd /c del \"%~f0\"&exit /b");
    }

    Desktop.getDesktop().open(scriptFile);
}

public static void selfDestructJARFile() throws Exception
{
    if (SystemUtils.IS_OS_WINDOWS)
    {
        selfDestructWindowsJARFile();
    } else
    {
        // Unix does not lock the JAR file so we can just delete it
        File directoryFilePath = ProgramDirectoryUtilities.getCurrentJARFilePath();
        Files.delete(directoryFilePath.toPath());
    }

    System.exit(0);
}

ProgramDirectoryUtilities上课:

public class ProgramDirectoryUtilities
{
    private static String getJarName()
    {
        return new File(ProgramDirectoryUtilities.class.getProtectionDomain()
                .getCodeSource()
                .getLocation()
                .getPath())
                .getName();
    }

    public static boolean isRunningFromJAR()
    {
        String jarName = getJarName();
        return jarName.contains(".jar");
    }

    public static String getProgramDirectory()
    {
        if (isRunningFromJAR())
        {
            return getCurrentJARDirectory();
        } else
        {
            return getCurrentProjectDirectory();
        }
    }

    private static String getCurrentProjectDirectory()
    {
        return new File("").getAbsolutePath();
    }

    public static String getCurrentJARDirectory()
    {
        try
        {
            return getCurrentJARFilePath().getParent();
        } catch (URISyntaxException exception)
        {
            exception.printStackTrace();
        }

        throw new IllegalStateException("Unexpected null JAR path");
    }

    public static File getCurrentJARFilePath() throws URISyntaxException
    {
        return new File(ProgramDirectoryUtilities.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
    }
}

this问题启发的解决方案。

这是一种更好的Windows方法:

private static void selfDestructWindowsJARFile() throws Exception
{
    String currentJARFilePath = ProgramDirectoryUtilities.getCurrentJARFilePath().toString();
    Runtime runtime = Runtime.getRuntime();
    runtime.exec("cmd /c ping localhost -n 2 > nul && del \"" + currentJARFilePath + "\"");
}

Here是最初的答案。

答案 3 :(得分:-1)

我猜这很有可能。也许你可以删除这样的jar,并确保应用程序消失,因为你拥有权利。

File jar = new File(".\\app.jar");
jar.deleteOnExit();
System.exit(0);

也使用类似Nullsoft Scriptable Install System的内容,可以帮助您编写自己的安装/卸载程序。