public static String install(String outputFolder, ProgressListener pl, String... componentPaths) {
		StringBuilder sb = new StringBuilder();
		List<FileListEntry> files = new LinkedList<FileListEntry>();
		
		int t = 0;
		for (String path : componentPaths) {
			if (pl != null) {
				t++;
				pl.onProgress(t, componentPaths.length, String.format("Reading %s...", path));
			}					

			try {
				File file = new File(path);
				//String parentPath = file.getAbsoluteFile().getParent();
				
				XmlReader xmlReader = new XmlReader();
				XmlElement componentE = xmlReader.read(file).getChild("component");
				Component component = Component.fromXml(new File(".").getAbsolutePath(), componentE);
				
				for (Iterator<FileListEntry> i = files.iterator(); i.hasNext(); ) {
					FileListEntry f = i.next();
					for (FileListEntry nf : component.getFiles()) {
						if (f.getPath().equals(nf.getPath())) {
							i.remove(); //Overwrite old file
							break;
						}
					}
				}
				
				files.addAll(component.getFiles());
			} catch (Exception e) {
				e.printStackTrace();
				sb.append(e);
				sb.append('\n');
			}
		}
		
		installFileList(outputFolder, pl, files);
		
		if (pl != null) pl.onFinished("");
		return sb.toString();
	}