我正在使用Ant创建一个zip文件。我还想用令牌所在的行号替换压缩文件中的令牌。我曾尝试使用FilterChain,但我不知道如何使用zipfileset。有什么建议吗?
我在这里添加一个例子。假设我有一个文件test.js,如下所示:
function start(){
console.debug("Start");
}
function end(){
console.debug("End");
}
function processLine(line){
console.debug("processLine"/*--location--*/);
}
我想用"test.js:10"替换/*--location-*/。我已经创建了一个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>
但我不知道如何获取文件名。然后我想在压缩文件时使用这个过滤器,而不是复制。
<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()
尝试在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;
}