package com.vci.ant.ext.tasks;
|
|
import java.io.File;
|
import java.io.FileWriter;
|
import java.io.IOException;
|
import java.io.StringWriter;
|
import java.util.ArrayList;
|
import java.util.Iterator;
|
import java.util.List;
|
import java.util.concurrent.TimeUnit;
|
|
import javax.swing.JFileChooser;
|
|
import org.apache.commons.io.FileUtils;
|
import org.apache.tools.ant.BuildException;
|
import org.apache.tools.ant.Location;
|
import org.apache.tools.ant.Project;
|
import org.apache.tools.ant.taskdefs.MatchingTask;
|
import org.apache.tools.ant.types.FileSet;
|
import org.dom4j.Attribute;
|
import org.dom4j.Document;
|
import org.dom4j.DocumentFactory;
|
import org.dom4j.DocumentHelper;
|
import org.dom4j.Element;
|
import org.dom4j.io.DocumentSource;
|
import org.dom4j.io.OutputFormat;
|
import org.dom4j.io.SAXReader;
|
import org.dom4j.io.SAXWriter;
|
import org.dom4j.io.XMLWriter;
|
|
/**
|
*
|
* <p>Title: 自动加载指定目录(包含子目录)下全部的.jar到项目的Classpath</p>
|
* <p>Description: 自动加载指定目录(包含子目录)下全部的.jar到项目的Classpath</p>
|
* <p></p>
|
* <p>Copyright: Copyright (c) 2017</p>
|
* <p>Company: VCI</p>
|
* @author xiongchao
|
* @time 2017-9-8
|
* @version 1.0
|
*/
|
public class AutoLoadJarToClasspath extends MatchingTask {
|
private String showChooseDialog = "true";
|
private String platformJarProjectPath = "";
|
|
public String getShowChooseDialog() {
|
return showChooseDialog;
|
}
|
|
public void setShowChooseDialog(String showChooseDialog) {
|
this.showChooseDialog = showChooseDialog;
|
}
|
|
public String getPlatformJarProjectPath() {
|
return platformJarProjectPath;
|
}
|
|
public void setPlatformJarProjectPath(String platformJarProjectPath) {
|
this.platformJarProjectPath = platformJarProjectPath;
|
}
|
|
@Override
|
public void execute() throws BuildException{
|
try{
|
Project project = super.getProject();
|
File workspaceFile = project.getBaseDir().getParentFile().getCanonicalFile();
|
String workspaceFullPath = workspaceFile.getCanonicalPath();
|
|
File projectFile = project.getBaseDir().getCanonicalFile();
|
String projectFullPath = projectFile.getCanonicalPath();
|
String projectDirName = projectFile.getName();
|
|
File f = null;
|
String jarPath = getPlatformJarProjectPath();
|
if(getShowChooseDialog() != null && "true".equalsIgnoreCase(getShowChooseDialog())){
|
try {
|
f = getChooseFile();
|
if(f == null){
|
System.out.println("选择无效");
|
}
|
} catch (IOException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
return;
|
}
|
} else {
|
f = new File(jarPath);
|
if(f != null){
|
f = f.getCanonicalFile();
|
}
|
}
|
if(f == null){
|
return;
|
}
|
String classpathFileName = projectFullPath.replace("\\", "/") + "/.classpath";
|
List<Element> classpathEntrys = new ArrayList<Element>();
|
getJarFiles(f, workspaceFullPath, classpathEntrys);
|
SAXReader reader = new SAXReader(DocumentFactory.getInstance());
|
Document doc = reader.read(new File(classpathFileName));
|
Element root = doc.getRootElement();
|
@SuppressWarnings("unchecked")
|
Iterator<Element> elements = (Iterator<Element>)root.elementIterator();
|
while(elements.hasNext()){
|
Element e = elements.next();
|
if(isLibClasspathEntryElement(e)){
|
root.remove(e);
|
}
|
}
|
for (Element e : classpathEntrys) {
|
root.add(e);
|
}
|
|
OutputFormat format = OutputFormat.createPrettyPrint();
|
format.setEncoding(doc.getXMLEncoding());
|
XMLWriter write = new XMLWriter(new FileWriter(classpathFileName), format);
|
write.write(doc);
|
write.flush();
|
write.close();
|
System.out.println(classpathFileName + " 已更新,请刷新项目(" + projectDirName + ")!");
|
}catch(Throwable e){
|
e.printStackTrace();
|
throw new BuildException(e);
|
}
|
}
|
private boolean isLibClasspathEntryElement(Element e){
|
boolean res = false;
|
Attribute attrKind = e.attribute("kind");
|
Attribute attrPath = e.attribute("path");
|
if(attrKind != null && attrPath != null
|
&& "lib".equalsIgnoreCase(attrKind.getValue())
|
&& (attrPath.getValue().endsWith(".jar"))){
|
res = true;
|
}
|
return res;
|
}
|
|
private File getChooseFile() throws IOException{
|
String path = super.getProject().getBaseDir().getName();
|
if(path.contains("_")){
|
String[] paths = path.split("_");
|
paths[0] = "VCI-JAR";
|
StringBuffer sb = new StringBuffer();
|
for (int i = 0; i < paths.length; i++) {
|
sb.append(paths[i]);
|
if(i != paths.length - 1){
|
sb.append("_");
|
}
|
}
|
File f = new File(super.getProject().getBaseDir().getParent(), sb.toString());
|
System.out.println("a"+super.getProject().getBaseDir().getParent() + "/" + sb.toString());
|
path = f.getCanonicalPath();
|
System.out.println("c"+path);
|
} else {
|
path = super.getProject().getBaseDir().getParentFile().getCanonicalPath();
|
}
|
JFileChooser jfc = new JFileChooser(path);
|
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
|
jfc.showOpenDialog(null);
|
File f = jfc.getSelectedFile();
|
return f;
|
}
|
|
private void getJarFiles(File file, String workspaceFullPath,
|
List<Element> classpathEntrys) throws IOException{
|
File[] childFiles = file.listFiles();
|
if(childFiles == null){
|
return;
|
}
|
for (File childFile : childFiles) {
|
if(childFile.getName().equals(".svn")){
|
continue;
|
}
|
if(childFile.isDirectory()){
|
getJarFiles(childFile, workspaceFullPath, classpathEntrys);
|
} else if(childFile.getName().endsWith(".jar")){
|
Element e = DocumentHelper.createElement("classpathentry");
|
e.add(DocumentHelper.createAttribute(e, "kind", "lib"));
|
e.add(DocumentHelper.createAttribute(e, "path", childFile.getCanonicalPath().replace(workspaceFullPath, "").replace("\\", "/")));
|
classpathEntrys.add(e);
|
}
|
}
|
}
|
}
|