如何在IzPack 5 InstallerListener方法中获取AutomatedInstallData?

时间:2015-08-11 20:32:13

标签: izpack

我试图找到关于此的任何信息但失败了,也许这里有人可以提供帮助。

我使用IzPack 5几个星期,这就是我的开始,所以我没有以前的IzPack 4经验。

我想做的是以下内容:

  1. 让用户有机会通过选择数据目录 UserInputPanel(工作正常)
  2. 通过检查是否验证条目 数据库已经存在(工作正常)
  3. 取决于是否 数据库已经存在,如果指定了“force”标志 UserInputPanel在包之后创建数据库 安装
  4. 这最后一步,就是我看不到该怎么做。

    我有一个实现InstallerListener接口的java类:

    public class IzPackInstaller implements com.izforge.izpack.api.data.DynamicInstallerRequirementValidator,
     com.izforge.izpack.api.event.InstallerListener {
    

    这是我用于第2步的数据验证/ db存在检查和第3步创建的相同类,只是出于方便的原因,但它应该无关紧要

    我重写

    @Override
    public void afterInstallerInitialization(AutomatedInstallData data)
            throws Exception {
        System.out.println("Called afterInstallerInitialization");
        System.out.println("db.location=" + data.getVariable("db.location"));
        System.out.println("db.force.creation=" + data.getVariable("db.force.creation"));
    }
    

    但它似乎完全被弃用,并且从未在运行时调用 - 使用System.out检查。 这同样适用于:

    @Override
    public void afterPacks(AutomatedInstallData data,
            AbstractUIProgressHandler handler) throws Exception {
        System.out.println("Never called!");
    }
    

    我也覆盖

    @Override 
    public void afterPacks(List<Pack> packs, ProgressListener listener) { }
    

    这叫做好吧,但是如何在这个方法中掌握AutomatedInstallData?或者我怎么能在这个阶段读取安装程序变量?

    我想创建一个单例,我会在DynamicInstallerRequirementValidator.validateData()调用期间使用变量进行初始化,并在稍后的时间点获取变量,但它很难看,听起来像一个讨厌的解决方法 - 应该有一种方法实现InstallerListener接口并能够使用变量,不应该吗?

    我真的很感激任何提示......

    安东

1 个答案:

答案 0 :(得分:0)

这不是一个非常干净的解决方案但是有一种方法可以在运行izpack java的任何地方获得AutomatedInstallData,而不会实际覆盖某些方法等。我不会在第一时间建议它,因为它有点棘手:)

public class Test {
  InstallerContainer container = new ConsoleInstallerContainer();
  AutomatedInstaller automatedInstaller = container.getComponent(AutomatedInstaller.class);
  AutomatedInstallData installData;

  public Test() throws IllegalAccessException, NoSuchFieldException {
    Field f = AutomatedInstaller.class.getDeclaredField("installData");
    f.setAccessible(true);
    installData = (AutomatedInstallData)f.get(automatedInstaller);
  }

  etc...

现在您将可以访问AutomatedInstallData对象及其方法。