blob: 4dfe520909d932c390d394c04db39697bcd8dc6c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2014 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 219530 [jar application] add Jar-in-Jar ClassLoader option
* Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262766 [jar exporter] ANT file for Jar-in-Jar option contains relative path to jar-rsrc-loader.zip
* Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262763 [jar exporter] remove Built-By attribute in ANT files from Fat JAR Exporter
* Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 269201 [jar exporter] ant file produced by Export runnable jar contains absolut paths instead of relative to workspace
*******************************************************************************/
package org.eclipse.jdt.internal.ui.jarpackagerfat;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.ILaunchConfiguration;
/**
* Create an ANT script for a runnable JAR wit libraries in a sub-folder. The script is generated
* based on the classpath of the selected launch-configuration.
*
* @since 3.5
*/
public class UnpackJarAntExporter extends FatJarAntExporter {
public UnpackJarAntExporter(IPath antScriptLocation, IPath jarLocation, ILaunchConfiguration launchConfiguration) {
super(antScriptLocation, jarLocation, launchConfiguration);
}
@Override
protected void buildANTScript(IPath antScriptLocation, String projectName, IPath absJarfile, String mainClass, SourceInfo[] sourceInfos) throws IOException {
try (OutputStream outputStream = new FileOutputStream(antScriptLocation.toFile())) {
String absJarname= absJarfile.toString();
String subfolder= absJarfile.removeFileExtension().lastSegment() + "_lib"; //$NON-NLS-1$
String absSubfolder= absJarfile.removeLastSegments(1).append(subfolder).toString();
DocumentBuilder docBuilder= null;
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
factory.setValidating(false);
try {
docBuilder= factory.newDocumentBuilder();
} catch (ParserConfigurationException ex) {
throw new IOException(FatJarPackagerMessages.FatJarPackageAntScript_error_couldNotGetXmlBuilder);
}
Document document= docBuilder.newDocument();
Node comment;
// Create the document
Element project= document.createElement("project"); //$NON-NLS-1$
project.setAttribute("name", "Create Runnable Jar for Project " + projectName + " with libraries in sub-folder"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
project.setAttribute("default", "create_run_jar"); //$NON-NLS-1$ //$NON-NLS-2$
comment= document.createComment("this file was created by Eclipse Runnable JAR Export Wizard"); //$NON-NLS-1$
project.appendChild(comment);
comment= document.createComment("ANT 1.7 is required "); //$NON-NLS-1$
project.appendChild(comment);
document.appendChild(project);
addBaseDirProperties(document, project);
Element target= document.createElement("target"); //$NON-NLS-1$
target.setAttribute("name", "create_run_jar"); //$NON-NLS-1$ //$NON-NLS-2$
project.appendChild(target);
Element jar= document.createElement("jar"); //$NON-NLS-1$
jar.setAttribute("destfile", substituteBaseDirs(absJarname)); //$NON-NLS-1$s
target.appendChild(jar);
Element manifest= document.createElement("manifest"); //$NON-NLS-1$
jar.appendChild(manifest);
Element attribute= document.createElement("attribute"); //$NON-NLS-1$
attribute.setAttribute("name", "Main-Class"); //$NON-NLS-1$ //$NON-NLS-2$s
attribute.setAttribute("value", mainClass); //$NON-NLS-1$
manifest.appendChild(attribute);
attribute= document.createElement("attribute"); //$NON-NLS-1$
attribute.setAttribute("name", "Class-Path"); //$NON-NLS-1$ //$NON-NLS-2$s
StringBuilder classPath= new StringBuilder();
classPath.append("."); //$NON-NLS-1$
for (SourceInfo sourceInfo : sourceInfos) {
if (sourceInfo.isJar) {
classPath.append(" ").append(subfolder).append("/") //$NON-NLS-1$ //$NON-NLS-2$
.append(new File(sourceInfo.absPath).getName());
}
}
attribute.setAttribute("value", classPath.toString()); //$NON-NLS-1$
manifest.appendChild(attribute);
// add folders
for (SourceInfo sourceInfo : sourceInfos) {
if (!sourceInfo.isJar) {
Element fileset= document.createElement("fileset"); //$NON-NLS-1$
fileset.setAttribute("dir", substituteBaseDirs(sourceInfo.absPath)); //$NON-NLS-1$
jar.appendChild(fileset);
}
}
Element delete= document.createElement("delete"); //$NON-NLS-1$
delete.setAttribute("dir", substituteBaseDirs(absSubfolder)); //$NON-NLS-1$s
target.appendChild(delete);
Element mkdir= document.createElement("mkdir"); //$NON-NLS-1$
mkdir.setAttribute("dir", substituteBaseDirs(absSubfolder)); //$NON-NLS-1$s
target.appendChild(mkdir);
// add libraries
for (SourceInfo sourceInfo : sourceInfos) {
if (sourceInfo.isJar) {
Element copy= document.createElement("copy"); //$NON-NLS-1$
copy.setAttribute("file", substituteBaseDirs(sourceInfo.absPath)); //$NON-NLS-1$
copy.setAttribute("todir", substituteBaseDirs(absSubfolder)); //$NON-NLS-1$
target.appendChild(copy);
}
}
// add folders
for (SourceInfo sourceInfo : sourceInfos) {
if (!sourceInfo.isJar) {
}
}
try {
// Write the document to the stream
Transformer transformer= TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); //$NON-NLS-1$ //$NON-NLS-2$
DOMSource source= new DOMSource(document);
StreamResult result= new StreamResult(outputStream);
transformer.transform(source, result);
} catch (TransformerException e) {
throw new IOException(FatJarPackagerMessages.FatJarPackageAntScript_error_couldNotTransformToXML);
}
}
}
}