ant用添加到zip文件的文件中的行号替换令牌

时间:2014-04-18 17:44:22

标签: ant

我使用Ant创建了一个zip文件。我还要将压缩文件中的标记替换为标记所在的行号。我曾尝试使用FilterChain,但我不知道如何使用zipfileset。有什么建议吗?


我在这里添加一个例子。让我们说我有一个像这样的文件test.js:

function start(){
   console.debug("Start");
}

function end(){
   console.debug("End");
}

function processLine(line){
   console.debug("processLine"/*--location--*/);
}

我想替换/ * - location-- * / with," test.js:10"。我设法创建了一个写入行号的FilterReader

@Override
public int read() throws IOException {
    if (!getInitialized()) {
        initialize();
        setInitialized(true);
    }

    int ch = -1;

    if (line != null) {
        ch = line.charAt(0);
        if (line.length() == 1) {
            line = null;
        } else {
            line = line.substring(1);
        }
    } else {
        lineNumber++;
        line = readLine();
        System.out.println("line " + line);
        if (line != null) {
            line = line.replace("/*--location--*/", ",\"pagina:"+lineNumber+"\"");
            return read();
        }
    }
    return ch;
}

我可以使用带过滤链的副本来调用它

<copy file="${src}/ant-util/test/resources/box.js" tofile="${installation}/box.js">
  <filterchain>
    <filterreader classname="com.xxx.util.ant.AddLineNumberReaderFilter"/>
  </filterchain>
</copy>         

但我不知道如何获取文件名。然后我想在压缩文件时使用此过滤器,而不是复制。

2 个答案:

答案 0 :(得分:1)

<copy file="${src}/ant-util/test/resources/box.js" tofile="${installation}/box.js">
<filterchain>
 <filterreader classname="com.xxx.util.ant.AddLineNumberReaderFilter">
  <param name="name" value="value"/>
 </filterreader>
</filterchain>
</copy>  

在Ant Reader类中,创建setter / getter方法

public void setName(String filename)
public String getName()

答案 1 :(得分:0)

尝试在FilterReader的构造函数中调用此方法

private String determineFilepath() {
    String result = null;
    Object obj = lock;
    while(obj != null && !(obj instanceof FileInputStream)) {
        obj = findField(obj, "lock");
    }
    if(obj instanceof FileInputStream) {
        result = (String)findField(obj, "path");
    }
    return result;
}

private Object findField(Object obj, String fieldName) {
    Object result = null;
    if(obj != null) {
        Class<? extends Object> clazz = obj.getClass();
        Field field = null;
        while(clazz != null) {
            try {
                field = clazz.getDeclaredField(fieldName);
            }
            catch(NoSuchFieldException e) {}

            if(field != null) {
                break;
            }
            else {
                clazz = clazz.getSuperclass();
            }
        }
        if(field != null) {
            field.setAccessible(true);
            try {
                result = field.get(obj);
            }
            catch(IllegalArgumentException | IllegalAccessException e) {}
        }
    }

    return result;
}