1

<zipfileset>タスク間でリソースのグループを再利用する唯一の方法として、私たちのカスタム (もちろん以前は機能していた) Ant タスクを変換しましたが<zip>、カスタム タスクはリソース コレクションを使用することが判明しました。つまり、本質的に、代わりに で<fileset>ラップしただけ<mappedresources>です。

<project name="test" default="installers">
  <target name="installers">
    <union id="common">
      <fileset prefix="." dir="." includes="1"/>
      <mappedresources>
        <fileset dir="." includes="2"/>
        <globmapper from="*" to="3/*"/>
      </mappedresources>
    </union>
    <generate-wix>
      <resources refid="common"/>
    </generate-wix>
  </target>
</project>

カスタム タスクは次のようになります。WiX 固有のがらくたはすべて省略されています

public class GenerateWixTask extends Task {
    private Resources resources;

    @Override
    public void execute() throws BuildException {
        // omitting root element setup

        Iterator<?> resourceIterator = resources.iterator();
        while (resourceIterator.hasNext()) {
            Resource resource = (Resource) resourceIterator.next();

            // This is the relative path with respect to the WiX install.
            File filePath = new File(resource.getName());
            //String fileName = filePath.getName();

            // This is the file which will be used as the actual data.
            //TODO: How to get this?

            System.out.println("resource: " + resource.getName());
            System.out.println("  which is a " + resource.getClass());
            System.out.println("  name = " + resource.getName());
            System.out.println("  location = " + resource.getLocation());

            FileProvider provider = (FileProvider) resource.as(FileProvider.class);
            if (provider != null) {
                System.out.println("  file = " + provider.getFile());
            }


        }

        // omitting code to write the XML
    }

    public void setResourcesref(Reference resourcesref) {
        createResources().setRefid(resourcesref);
    }

    public Resources createResources() {
        if (resources == null) {
            resources = new Resources();
            resources.setProject(getProject());
        }
        return resources;
    }
}

これにより得られる出力は次のとおりです。

[generatewix] resource: 1
[generatewix]   which is a class org.apache.tools.ant.types.resources.FileResource
[generatewix]   name = 1
[generatewix]   location =
[generatewix]   file = C:\Data\test\1
[generatewix] resource: 3/2
[generatewix]   which is a class org.apache.tools.ant.types.resources.MappedResource
[generatewix]   name = 3/2
[generatewix]   location =

MappedResource のソース コードを読むと、FileProvider はソース ファイルを非表示にするために特別に処理されます (コメントは悪用を防ぐためのように聞こえます... 私は正確にそれを悪用しようとしているわけではありません)。別のアプリケーションが読み取る XML ファイルを作成しているため、ファイルへのパス...

これに対する回避策はありますか?

4

1 に答える 1

0

マップされたパスが real のソースにならないことは明らかですFile。MappedResourceはFileResourceはありません。

getInputStream()からデータを読み込んで、 で指定された新しいパスに書き込んでみてくださいgetName()

于 2012-10-17T06:08:25.150 に答える