/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.asual.summer.onejar; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.List; import java.util.jar.JarInputStream; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import org.apache.commons.io.IOUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.model.Dependency; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.project.MavenProjectHelper; /** * @goal onejar * @phase package * @requiresProject * @requiresDependencyResolution runtime * * @author Rostislav Hristov * */ @SuppressWarnings("deprecation") public class OneJarMojo extends AbstractMojo { /** * @parameter default-value="${localRepository}" * @readonly */ private ArtifactRepository localRepository; /** * @parameter default-value="${project.pluginArtifacts}" * @readonly */ private Collection<Artifact> pluginArtifacts; /** * @parameter default-value="${project.remoteArtifactRepositories}" * @readonly */ private List<ArtifactRepository> remoteArtifactRepositories; /** * @parameter expression="${project.build.directory}" * @readonly */ private File buildDirectory; /** * @parameter expression="${project.build.finalName}.war" * @readonly */ private String warName; /** * @parameter expression="${project.build.finalName}-onejar.jar" * @readonly */ private String jarName; /** * @parameter expression="${project}" * @readonly */ private MavenProject project; /** * @component * @readonly */ private MavenProjectHelper projectHelper; /** * @component * @readonly */ private MavenProjectBuilder mavenProjectBuilder; /** * @component * @readonly */ private ArtifactFactory artifactFactory; private static String JAR_CLASSPATH = "lib/"; private static String JAR_MAIN_CLASS = "com.simontuffs.onejar.Boot"; private static String ONE_JAR_DIST = "one-jar-boot-0.96.jar"; private static String ONE_JAR_MAIN_CLASS = "com.asual.summer.onejar.OneJarServer"; public void execute() throws MojoExecutionException { JarOutputStream out = null; JarInputStream in = null; try { File jarFile = new File(buildDirectory, jarName); File warFile = new File(buildDirectory, warName); Manifest manifest = new Manifest(new ByteArrayInputStream("Manifest-Version: 1.0\n".getBytes("UTF-8"))); manifest.getMainAttributes().putValue("Main-Class", JAR_MAIN_CLASS); manifest.getMainAttributes().putValue("One-Jar-Main-Class", ONE_JAR_MAIN_CLASS); out = new JarOutputStream(new FileOutputStream(jarFile, false), manifest); in = new JarInputStream(getClass().getClassLoader().getResourceAsStream(ONE_JAR_DIST)); putEntry(out, new FileInputStream(warFile), new ZipEntry(JAR_CLASSPATH + warFile.getName())); for (Artifact artifact : pluginArtifacts) { if (artifact.getArtifactId().equalsIgnoreCase("summer-onejar")) { artifact.updateVersion(artifact.getVersion(), localRepository); putEntry(out, new FileInputStream(artifact.getFile()), new ZipEntry(JAR_CLASSPATH + artifact.getFile().getName())); MavenProject project = mavenProjectBuilder.buildFromRepository(artifact, remoteArtifactRepositories, localRepository); List<Dependency> dependencies = project.getDependencies(); for (Dependency dependency : dependencies) { if (!"provided".equals(dependency.getScope())) { Artifact dependencyArtifact = artifactFactory.createArtifact( dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion(), dependency.getScope(), dependency.getType()); dependencyArtifact.updateVersion(dependencyArtifact.getVersion(), localRepository); putEntry(out, new FileInputStream(dependencyArtifact.getFile()), new ZipEntry(JAR_CLASSPATH + dependencyArtifact.getFile().getName())); } } } } while (true) { ZipEntry entry = in.getNextEntry(); if (entry != null) { putEntry(out, in, entry); } else { break; } } projectHelper.attachArtifact(project, "jar", jarFile); } catch (Exception e) { getLog().error(e.getMessage(), e); throw new MojoExecutionException(e.getMessage(), e); } finally { IOUtils.closeQuietly(out); IOUtils.closeQuietly(in); } } private void putEntry(JarOutputStream out, InputStream in, ZipEntry entry) throws IOException { out.putNextEntry(entry); IOUtils.copy(in, out); out.closeEntry(); } }