All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jboss.as.plugin.server.Start Maven / Gradle / Ivy

The newest version!
/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2013, Red Hat, Inc., and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.jboss.as.plugin.server;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
import org.jboss.as.plugin.common.AbstractServerMojo;
import org.jboss.as.plugin.common.Files;
import org.jboss.as.plugin.common.PropertyNames;

/**
 * Starts a standalone instance of JBoss Application Server 7.
 * 

* The purpose of this goal is to start a JBoss Application Server for testing during the maven lifecycle. This can * start a remote server, but the server will be shutdown when the maven process ends. * * @author James R. Perkins */ @Mojo(name = "start", requiresDependencyResolution = ResolutionScope.RUNTIME) public class Start extends AbstractServerMojo { public static final String JBOSS_DIR = "jboss-as-run"; /** * The project */ @Parameter(defaultValue = "${project}", readonly = true, required = true) protected MavenProject project; /** * The target directory the application to be deployed is located. */ @Parameter(defaultValue = "${project.build.directory}", readonly = true, required = true) private File targetDir; @Component private ArtifactResolver artifactResolver; /** * The JBoss Application Server's home directory. If not used, JBoss Application Server will be downloaded. */ @Parameter(alias = "jboss-home", property = PropertyNames.JBOSS_HOME) private String jbossHome; /** * A string of the form groupId:artifactId:version[:packaging][:classifier]. Any missing portion of the artifact * will be replaced with the it's appropriate default property value */ @Parameter(property = PropertyNames.JBOSS_ARTIFACT) private String artifact; /** * The {@code groupId} of the artifact to download. Ignored if {@link #artifact} {@code groupId} portion is used. */ @Parameter(defaultValue = Defaults.JBOSS_AS_GROUP_ID, property = PropertyNames.JBOSS_GROUP_ID) private String groupId; /** * The {@code artifactId} of the artifact to download. Ignored if {@link #artifact} {@code artifactId} portion is * used. */ @Parameter(defaultValue = Defaults.JBOSS_AS_ARTIFACT_ID, property = PropertyNames.JBOSS_ARTIFACT_ID) private String artifactId; /** * The {@code classifier} of the artifact to download. Ignored if {@link #artifact} {@code classifier} portion is * used. */ @Parameter(property = PropertyNames.JBOSS_CLASSIFIER) private String classifier; /** * The {@code packaging} of the artifact to download. Ignored if {@link #artifact} {@code packing} portion is used. */ @Parameter(property = PropertyNames.JBOSS_PACKAGING, defaultValue = Defaults.JBOSS_AS_PACKAGING) private String packaging; /** * The {@code version} of the artifact to download. Ignored if {@link #artifact} {@code version} portion is used. */ @Parameter(alias = "jboss-as-version", defaultValue = Defaults.JBOSS_AS_TARGET_VERSION, property = PropertyNames.JBOSS_VERSION) private String version; /** * The modules path or paths to use. A single path can be used or multiple paths by enclosing them in a paths * element. */ @Parameter(alias = "modules-path", property = PropertyNames.MODULES_PATH) private ModulesPath modulesPath; /** * The bundles path to use. */ @Parameter(alias = "bundles-path", property = PropertyNames.BUNDLES_PATH) private String bundlesPath; /** * A space delimited list of JVM arguments. *

* Default value is {@code -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true * -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000} */ @Parameter(alias = "jvm-args", property = PropertyNames.JVM_ARGS) private JavaOpts jvmArgs; /** * The {@code JAVA_HOME} to use for launching the server. */ @Parameter(alias = "java-home", property = PropertyNames.JAVA_HOME) private String javaHome; /** * The path to the server configuration to use. */ @Parameter(alias = "server-config", property = PropertyNames.SERVER_CONFIG) private String serverConfig; /** * The path to the system properties file to load. */ @Parameter(alias = "properties-file", property = PropertyNames.PROPERTIES_FILE) private String propertiesFile; /** * A space delimited list of server arguments. */ @Parameter(alias = "server-args", property = PropertyNames.SERVER_ARGS) private String[] serverArgs; /** * The arguments to be passed to the server. */ @Parameter(alias = "startup-timeout", defaultValue = Defaults.TIMEOUT, property = PropertyNames.STARTUP_TIMEOUT) private long startupTimeout; @Override public void execute() throws MojoExecutionException, MojoFailureException { final Log log = getLog(); if (isSkip()) { log.debug("Skipping server start"); return; } // Validate the environment final File jbossHome = extractIfRequired(targetDir); if (!jbossHome.isDirectory()) { throw new MojoExecutionException(String.format("JBOSS_HOME '%s' is not a valid directory.", jbossHome)); } final String javaHome; if (this.javaHome == null) { javaHome = SecurityActions.getEnvironmentVariable("JAVA_HOME"); } else { javaHome = this.javaHome; } final List invalidPaths = modulesPath.validate(); if (!invalidPaths.isEmpty()) { throw new MojoExecutionException("Invalid module path(s). " + invalidPaths); } final ServerConfig serverConfig = ServerConfig.of(this, jbossHome) .setJavaHome(javaHome) .setModulesDir(modulesPath.get()) .setBundlesDir(bundlesPath) .setJvmArgs(jvmArgs.getArgs()) .setServerConfig(this.serverConfig) .setPropertiesFile(propertiesFile) .setServerArgs(serverArgs) .setStartupTimeout(startupTimeout); // Print some server information log.info(String.format("JAVA_HOME=%s", javaHome)); log.info(String.format("JBOSS_HOME=%s%n", jbossHome)); try { // Create the server final Server server = new StandaloneServer(serverConfig); // Add the shutdown hook SecurityActions.registerShutdown(server); // Start the server log.info("Server is starting up."); server.start(); server.checkServerState(); } catch (Exception e) { throw new MojoExecutionException("The server failed to start", e); } } private File extractIfRequired(final File buildDir) throws MojoFailureException, MojoExecutionException { if (jbossHome != null) { //we do not need to download JBoss return new File(jbossHome); } final File result = artifactResolver.resolve(project, createArtifact()); final File target = new File(buildDir, JBOSS_DIR); // Delete the target if it exists if (target.exists()) { Files.deleteRecursively(target); } target.mkdirs(); try { Files.unzip(result, target); } catch (IOException e) { throw new MojoFailureException("Artifact was not successfully extracted: " + result, e); } final File[] files = target.listFiles(); if (files == null || files.length != 1) { throw new MojoFailureException("Artifact was not successfully extracted: " + result); } // Assume the first return files[0]; } @Override public String goal() { return "start"; } private String createArtifact() throws MojoFailureException { String groupId = this.groupId; String artifactId = this.artifactId; String classifier = this.classifier; String packaging = this.packaging; String version = this.version; // groupId:artifactId:version[:packaging][:classifier]. if (artifact != null) { final String[] artifactParts = artifact.split(":"); if (artifactParts.length == 0) { throw new MojoFailureException(String.format("Invalid artifact pattern: %s", artifact)); } String value; switch (artifactParts.length) { case 5: value = artifactParts[4].trim(); if (!value.isEmpty()) { classifier = value; } case 4: value = artifactParts[3].trim(); if (!value.isEmpty()) { packaging = value; } case 3: value = artifactParts[2].trim(); if (!value.isEmpty()) { version = value; } case 2: value = artifactParts[1].trim(); if (!value.isEmpty()) { artifactId = value; } case 1: value = artifactParts[0].trim(); if (!value.isEmpty()) { groupId = value; } } } // Validate the groupId, artifactId and version are not null if (groupId == null || artifactId == null || version == null) { throw new IllegalStateException("The groupId, artifactId and version parameters are required"); } final StringBuilder result = new StringBuilder(); result.append(groupId) .append(':') .append(artifactId) .append(':') .append(version) .append(':'); if (packaging != null) { result.append(packaging); } result.append(':'); if (classifier != null) { result.append(classifier); } return result.toString(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy