我使用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>
但我不知道如何获取文件名。然后我想在压缩文件时使用此过滤器,而不是复制。
答案 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;
}