我的问题是:
在sys.contentDir
我们有libs
目录。在此目录中,我们有client
和server
目录。 (实际上我们有更多,但为了简洁,让我们保持简单。)
因此,当我们进行更新安装时,我们要删除这些目录中的所有jar /文件(client
/ server
),但不删除子目录名称为ext
和plugin
。
让它更容易理解:
因此,外部矩形中的所有内容都将被卸载,但内部矩形中的所有内容都将保留原样。
因此,通常您会使用Uninstall files
操作,但由于两个原因,这在此特定情况下不起作用。
1.您可以指定要卸载的目录,但只有在下面没有子目录时才会生效(我们明确要求的)。
2.您还可以为每个文件指定是否应删除它。但是我们无法提供文件列表(所需的罐子),因为它可能会发生变化。
所以问题是:你如何最好地解决问题? (下面提供解决方案!)
答案 0 :(得分:1)
您可以使用“删除文件和目录”操作的“目录过滤器脚本”属性并将其设置为
File contentDirectory = context.getContentDirectory();
return !directory.equals(new File(contentDirectory, "lib/client/ext")) &&
!directory.equals(new File(contentDirectory, "lib/client/plugin"));
答案 1 :(得分:0)
所以我做的是在卸载过程中实现一个额外的步骤Delete files and directories
。
使用此目录配置:
${installer:sys.contentDir}
这是与install4j一起安装程序的独立于平台的地方。
Java代码是:
if (file.isDirectory()) {
return false;
}
File directory = new File(context.getInstallationDirectory(), "/lib");
if (!directory.exists()) {
return false;
}
List<File> subDirs = new ArrayList<>();
File[] delinquents = directory.listFiles();
for (File delinquent : delinquents) {
if (delinquent.isDirectory()) {
subDirs.add(delinquent);
}
}
for (File sub : subDirs) {
File[] filesInLib = sub.listFiles();
for(File theFile : filesInLib) {
if (theFile.equals(file))
{
Util.logInfo(null, "Delete " + file.getAbsolutePath());
return true;
}
}
}
return false;
它确实很完美。但我想知道是否有更好的解决方案,比如你只需配置这些东西而不使用任何代码。 (我不想使用大量代码片段来保持其可维护性。)