Author: olamy Date: Thu Dec 6 21:02:06 2012 New Revision: 1418074 URL: http://svn.apache.org/viewvc?rev=1418074&view=rev Log: [MTOMCAT-188] Allow for the creation of a war that is both executable and deployable Submitted by Mitch Kyle Patch applied with reformating code
Added: tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractStandaloneWarMojo.java (with props) tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/StandaloneWarMojo.java (with props) Modified: tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractExecWarMojo.java tomcat/maven-plugin/trunk/tomcat7-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat7Runner.java Modified: tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractExecWarMojo.java URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractExecWarMojo.java?rev=1418074&r1=1418073&r2=1418074&view=diff ============================================================================== --- tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractExecWarMojo.java (original) +++ tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractExecWarMojo.java Thu Dec 6 21:02:06 2012 @@ -69,45 +69,45 @@ public abstract class AbstractExecWarMoj extends AbstractTomcat7Mojo { - @Parameter (defaultValue = "${project.artifact}", required = true, readonly = true) - private Artifact projectArtifact; + @Parameter( defaultValue = "${project.artifact}", required = true, readonly = true ) + protected Artifact projectArtifact; /** * The maven project. */ - @Parameter (defaultValue = "${project}", required = true, readonly = true) + @Parameter( defaultValue = "${project}", required = true, readonly = true ) protected MavenProject project; - @Parameter (defaultValue = "${plugin.artifacts}", required = true) - private List<Artifact> pluginArtifacts; + @Parameter( defaultValue = "${plugin.artifacts}", required = true ) + protected List<Artifact> pluginArtifacts; - @Parameter (defaultValue = "${project.build.directory}") - private File buildDirectory; + @Parameter( defaultValue = "${project.build.directory}" ) + protected File buildDirectory; /** * Path under {@link #buildDirectory} where this mojo may do temporary work. */ - @Parameter (defaultValue = "${project.build.directory}/tomcat7-maven-plugin-exec") + @Parameter( defaultValue = "${project.build.directory}/tomcat7-maven-plugin-exec" ) private File pluginWorkDirectory; - @Parameter (property = "maven.tomcat.exec.war.tomcatConf", defaultValue = "src/main/tomcatconf") - private File tomcatConfigurationFilesDirectory; + @Parameter( property = "maven.tomcat.exec.war.tomcatConf", defaultValue = "src/main/tomcatconf" ) + protected File tomcatConfigurationFilesDirectory; - @Parameter (defaultValue = "src/main/tomcatconf/server.xml", property = "maven.tomcat.exec.war.serverXml") - private File serverXml; + @Parameter( defaultValue = "src/main/tomcatconf/server.xml", property = "maven.tomcat.exec.war.serverXml" ) + protected File serverXml; /** * Name of the generated exec JAR. */ - @Parameter (property = "tomcat.jar.finalName", - defaultValue = "${project.artifactId}-${project.version}-war-exec.jar", required = true) - private String finalName; + @Parameter( property = "tomcat.jar.finalName", + defaultValue = "${project.artifactId}-${project.version}-war-exec.jar", required = true ) + protected String finalName; /** * The webapp context path to use for the web application being run. * The name to store webapp in exec jar. Do not use / */ - @Parameter (property = "maven.tomcat.path", defaultValue = "${project.artifactId}", required = true) + @Parameter( property = "maven.tomcat.path", defaultValue = "${project.artifactId}", required = true ) protected String path; @Parameter @@ -120,82 +120,82 @@ public abstract class AbstractExecWarMoj * Maven Artifact Factory component. */ @Component - private ArtifactFactory artifactFactory; + protected ArtifactFactory artifactFactory; /** * Location of the local repository. */ - @Parameter (defaultValue = "${localRepository}", required = true, readonly = true) - private ArtifactRepository local; + @Parameter( defaultValue = "${localRepository}", required = true, readonly = true ) + protected ArtifactRepository local; /** * List of Remote Repositories used by the resolver */ - @Parameter (defaultValue = "${project.remoteArtifactRepositories}", required = true, readonly = true) + @Parameter( defaultValue = "${project.remoteArtifactRepositories}", required = true, readonly = true ) protected List<ArtifactRepository> remoteRepos; @Component - private MavenProjectHelper projectHelper; + protected MavenProjectHelper projectHelper; /** * Attach or not the generated artifact to the build (use true if you want to install or deploy it) */ - @Parameter (property = "maven.tomcat.exec.war.attachArtifact", defaultValue = "true", required = true) - private boolean attachArtifact; + @Parameter( property = "maven.tomcat.exec.war.attachArtifact", defaultValue = "true", required = true ) + protected boolean attachArtifact; /** * the classifier to use for the attached/generated artifact */ - @Parameter (property = "maven.tomcat.exec.war.attachArtifactClassifier", defaultValue = "exec-war", - required = true) - private String attachArtifactClassifier; + @Parameter( property = "maven.tomcat.exec.war.attachArtifactClassifier", defaultValue = "exec-war", + required = true ) + protected String attachArtifactClassifier; /** * the type to use for the attached/generated artifact */ - @Parameter (property = "maven.tomcat.exec.war.attachArtifactType", defaultValue = "jar", required = true) - private String attachArtifactClassifierType; + @Parameter( property = "maven.tomcat.exec.war.attachArtifactType", defaultValue = "jar", required = true ) + protected String attachArtifactClassifierType; /** * to enable naming when starting tomcat */ - @Parameter (property = "maven.tomcat.exec.war.enableNaming", defaultValue = "false", required = true) - private boolean enableNaming; + @Parameter( property = "maven.tomcat.exec.war.enableNaming", defaultValue = "false", required = true ) + protected boolean enableNaming; /** * see http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html */ - @Parameter (property = "maven.tomcat.exec.war.accessLogValveFormat", defaultValue = "%h %l %u %t %r %s %b %I %D", - required = true) - private String accessLogValveFormat; + @Parameter( property = "maven.tomcat.exec.war.accessLogValveFormat", defaultValue = "%h %l %u %t %r %s %b %I %D", + required = true ) + protected String accessLogValveFormat; /** * list of extra dependencies to add in the standalone tomcat jar: your jdbc driver, mail.jar etc.. * <b>Those dependencies will be in root classloader.</b> */ @Parameter - private List<ExtraDependency> extraDependencies; + protected List<ExtraDependency> extraDependencies; /** * list of extra resources to add in the standalone tomcat jar: your logger configuration etc */ @Parameter - private List<ExtraResource> extraResources; + protected List<ExtraResource> extraResources; /** * Main class to use for starting the standalone jar. */ - @Parameter (property = "maven.tomcat.exec.war.mainClass", - defaultValue = "org.apache.tomcat.maven.runner.Tomcat7RunnerCli", required = true) - private String mainClass; + @Parameter( property = "maven.tomcat.exec.war.mainClass", + defaultValue = "org.apache.tomcat.maven.runner.Tomcat7RunnerCli", required = true ) + protected String mainClass; /** * which connector protocol to use HTTP/1.1 or org.apache.coyote.http11.Http11NioProtocol */ - @Parameter (property = "maven.tomcat.exec.war.connectorHttpProtocol", defaultValue = "HTTP/1.1", required = true) - private String connectorHttpProtocol; + @Parameter( property = "maven.tomcat.exec.war.connectorHttpProtocol", defaultValue = "HTTP/1.1", required = true ) + protected String connectorHttpProtocol; public void execute() throws MojoExecutionException, MojoFailureException @@ -348,16 +348,7 @@ public abstract class AbstractExecWarMoj || StringUtils.equals( "tomcat7-war-runner", pluginArtifact.getArtifactId() ) ) { JarFile jarFile = new JarFile( pluginArtifact.getFile() ); - Enumeration<JarEntry> jarEntries = jarFile.entries(); - while ( jarEntries.hasMoreElements() ) - { - JarEntry jarEntry = jarEntries.nextElement(); - InputStream jarEntryIs = jarFile.getInputStream( jarEntry ); - - os.putArchiveEntry( new JarArchiveEntry( jarEntry.getName() ) ); - IOUtils.copy( jarEntryIs, os ); - os.closeArchiveEntry(); - } + extractJarToArchive( jarFile, os ); } } @@ -374,16 +365,7 @@ public abstract class AbstractExecWarMoj artifactResolver.resolve( artifact, this.remoteRepos, this.local ); JarFile jarFile = new JarFile( artifact.getFile() ); - Enumeration<JarEntry> jarEntries = jarFile.entries(); - while ( jarEntries.hasMoreElements() ) - { - JarEntry jarEntry = jarEntries.nextElement(); - InputStream jarEntryIs = jarFile.getInputStream( jarEntry ); - - os.putArchiveEntry( new JarArchiveEntry( jarEntry.getName() ) ); - IOUtils.copy( jarEntryIs, os ); - os.closeArchiveEntry(); - } + extractJarToArchive( jarFile, os ); } } @@ -468,8 +450,8 @@ public abstract class AbstractExecWarMoj } } - private void copyDirectoryContentIntoArchive( File pSourceFolder, String pDestinationPath, - ArchiveOutputStream pArchiveOutputSteam ) + protected void copyDirectoryContentIntoArchive( File pSourceFolder, String pDestinationPath, + ArchiveOutputStream pArchiveOutputSteam ) throws FileNotFoundException, IOException { @@ -514,7 +496,7 @@ public abstract class AbstractExecWarMoj } - private String[] toStringArray( List list ) + protected String[] toStringArray( List list ) { if ( list == null || list.isEmpty() ) { @@ -533,7 +515,7 @@ public abstract class AbstractExecWarMoj /** * return file can be deleted */ - private File addContextXmlToWar( File contextXmlFile, File warFile ) + protected File addContextXmlToWar( File contextXmlFile, File warFile ) throws IOException, ArchiveException { ArchiveOutputStream os = null; @@ -550,14 +532,7 @@ public abstract class AbstractExecWarMoj os.closeArchiveEntry(); JarFile jarFile = new JarFile( warFile ); - Enumeration<JarEntry> jarEntries = jarFile.entries(); - while ( jarEntries.hasMoreElements() ) - { - JarEntry jarEntry = jarEntries.nextElement(); - os.putArchiveEntry( new JarArchiveEntry( jarEntry.getName() ) ); - IOUtils.copy( jarFile.getInputStream( jarEntry ), os ); - os.closeArchiveEntry(); - } + extractJarToArchive( jarFile, os ); os.flush(); } finally @@ -567,4 +542,28 @@ public abstract class AbstractExecWarMoj } return tmpWar; } + + /** + * Copy the contents of a jar file to another archive + * + * @param file The input jar file + * @param os The output archive + * @throws IOException + */ + protected void extractJarToArchive( JarFile file, ArchiveOutputStream os ) + throws IOException + { + Enumeration<? extends JarEntry> entries = file.entries(); + while ( entries.hasMoreElements() ) + { + JarEntry j = entries.nextElement(); + os.putArchiveEntry( new JarArchiveEntry( j.getName() ) ); + IOUtils.copy( file.getInputStream( j ), os ); + os.closeArchiveEntry(); + } + if ( file != null ) + { + IOUtils.closeQuietly( file ); + } + } } Added: tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractStandaloneWarMojo.java URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractStandaloneWarMojo.java?rev=1418074&view=auto ============================================================================== --- tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractStandaloneWarMojo.java (added) +++ tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractStandaloneWarMojo.java Thu Dec 6 21:02:06 2012 @@ -0,0 +1,279 @@ +package org.apache.tomcat.maven.plugin.tomcat7.run; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Properties; +import java.util.jar.JarFile; + +import org.apache.commons.compress.archivers.ArchiveException; +import org.apache.commons.compress.archivers.ArchiveOutputStream; +import org.apache.commons.compress.archivers.ArchiveStreamFactory; +import org.apache.commons.compress.archivers.jar.JarArchiveEntry; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.resolver.ArtifactNotFoundException; +import org.apache.maven.artifact.resolver.ArtifactResolutionException; +import org.apache.maven.model.Dependency; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.tomcat.maven.runner.Tomcat7Runner; +import org.apache.tomcat.maven.runner.Tomcat7RunnerCli; +import org.codehaus.plexus.archiver.jar.Manifest; +import org.codehaus.plexus.archiver.jar.ManifestException; +import org.codehaus.plexus.util.DirectoryScanner; + +/** + * Abstract Mojo for building deployable and executable war files + * + * @author Mitch Kyle + * @since 2.1 + */ +public abstract class AbstractStandaloneWarMojo + extends AbstractExecWarMojo +{ + + /** + * Name of the generated WAR. + */ + @Parameter(property = "tomcat.jar.finalName", + defaultValue = "${project.artifactId}-${project.version}-standalone.war", required = true) + protected String finalName; + + /** + * the classifier to use for the attached/generated artifact + */ + @Parameter(property = "maven.tomcat.exec.war.attachArtifactClassifier", defaultValue = "standalone", + required = true) + protected String attachArtifactClassifier; + + public void execute() + throws MojoExecutionException, MojoFailureException + { + if ( !"war".equals( project.getPackaging() ) ) + { + throw new MojoFailureException( "Pacakaging must be of type war for standalone-war goal." ); + } + + File warExecFile = new File( buildDirectory, finalName ); + if ( warExecFile.exists() ) + { + warExecFile.delete(); + } + + File execWarJar = new File( buildDirectory, finalName ); + + FileOutputStream execWarJarOutputStream = null; + ArchiveOutputStream os = null; + File tmpPropertiesFile = null; + File tmpManifestFile = null; + FileOutputStream tmpPropertiesFileOutputStream = null; + PrintWriter tmpManifestWriter = null; + + try + { + tmpPropertiesFile = new File( buildDirectory, "war-exec.properties" ); + if ( tmpPropertiesFile.exists() ) + { + tmpPropertiesFile.delete(); + } + tmpPropertiesFile.getParentFile().mkdirs(); + + tmpManifestFile = new File( buildDirectory, "war-exec.manifest" ); + if ( tmpManifestFile.exists() ) + { + tmpManifestFile.delete(); + } + tmpPropertiesFileOutputStream = new FileOutputStream( tmpPropertiesFile ); + execWarJar.getParentFile().mkdirs(); + execWarJar.createNewFile(); + execWarJarOutputStream = new FileOutputStream( execWarJar ); + + tmpManifestWriter = new PrintWriter( tmpManifestFile ); + + // store : + //* wars in the root: foo.war + //* tomcat jars + //* file tomcat.standalone.properties with possible values : + // * useServerXml=true/false to use directly the one provided + // * enableNaming=true/false + // * wars=foo.war|contextpath;bar.war ( |contextpath is optionnal if empty use the war name ) + // * accessLogValveFormat= + // * connectorhttpProtocol: HTTP/1.1 or org.apache.coyote.http11.Http11NioProtocol + // * codeSourceContextPath=path parameter, default is project.artifactId + //* optionnal: conf/ with usual tomcat configuration files + //* MANIFEST with Main-Class + + Properties properties = new Properties(); + + properties.put( Tomcat7Runner.ARCHIVE_GENERATION_TIMESTAMP_KEY, + Long.toString( System.currentTimeMillis() ) ); + properties.put( Tomcat7Runner.ENABLE_NAMING_KEY, Boolean.toString( enableNaming ) ); + properties.put( Tomcat7Runner.ACCESS_LOG_VALVE_FORMAT_KEY, accessLogValveFormat ); + properties.put( Tomcat7Runner.HTTP_PROTOCOL_KEY, connectorHttpProtocol ); + properties.put( Tomcat7Runner.CODE_SOURCE_CONTEXT_PATH, path ); + + os = new ArchiveStreamFactory().createArchiveOutputStream( ArchiveStreamFactory.JAR, + execWarJarOutputStream ); + + extractJarToArchive( new JarFile( projectArtifact.getFile() ), os ); + + if ( serverXml != null && serverXml.exists() ) + { + os.putArchiveEntry( new JarArchiveEntry( "conf/server.xml" ) ); + IOUtils.copy( new FileInputStream( serverXml ), os ); + os.closeArchiveEntry(); + properties.put( Tomcat7Runner.USE_SERVER_XML_KEY, Boolean.TRUE.toString() ); + } + else + { + properties.put( Tomcat7Runner.USE_SERVER_XML_KEY, Boolean.FALSE.toString() ); + } + + os.putArchiveEntry( new JarArchiveEntry( "conf/web.xml" ) ); + IOUtils.copy( getClass().getResourceAsStream( "/conf/web.xml" ), os ); + os.closeArchiveEntry(); + + properties.store( tmpPropertiesFileOutputStream, "created by Apache Tomcat Maven plugin" ); + + tmpPropertiesFileOutputStream.flush(); + tmpPropertiesFileOutputStream.close(); + + os.putArchiveEntry( new JarArchiveEntry( Tomcat7RunnerCli.STAND_ALONE_PROPERTIES_FILENAME ) ); + IOUtils.copy( new FileInputStream( tmpPropertiesFile ), os ); + os.closeArchiveEntry(); + + // add tomcat classes + for ( Artifact pluginArtifact : pluginArtifacts ) + { + if ( StringUtils.equals( "org.apache.tomcat", pluginArtifact.getGroupId() ) || StringUtils.equals( + "org.apache.tomcat.embed", pluginArtifact.getGroupId() ) || StringUtils.equals( + "org.eclipse.jdt.core.compiler", pluginArtifact.getGroupId() ) || StringUtils.equals( "commons-cli", + pluginArtifact.getArtifactId() ) + || StringUtils.equals( "tomcat7-war-runner", pluginArtifact.getArtifactId() ) ) + { + JarFile jarFile = new JarFile( pluginArtifact.getFile() ); + extractJarToArchive( jarFile, os ); + } + } + + // add extra dependencies + if ( extraDependencies != null && !extraDependencies.isEmpty() ) + { + for ( Dependency dependency : extraDependencies ) + { + // String groupId, String artifactId, String version, String scope, String type + Artifact artifact = + artifactFactory.createArtifact( dependency.getGroupId(), dependency.getArtifactId(), + dependency.getVersion(), dependency.getScope(), + dependency.getType() ); + + artifactResolver.resolve( artifact, this.remoteRepos, this.local ); + JarFile jarFile = new JarFile( artifact.getFile() ); + extractJarToArchive( jarFile, os ); + } + } + + Manifest manifest = new Manifest(); + + Manifest.Attribute mainClassAtt = new Manifest.Attribute(); + mainClassAtt.setName( "Main-Class" ); + mainClassAtt.setValue( mainClass ); + manifest.addConfiguredAttribute( mainClassAtt ); + + manifest.write( tmpManifestWriter ); + tmpManifestWriter.flush(); + tmpManifestWriter.close(); + + os.putArchiveEntry( new JarArchiveEntry( "META-INF/MANIFEST.MF" ) ); + IOUtils.copy( new FileInputStream( tmpManifestFile ), os ); + os.closeArchiveEntry(); + + if ( attachArtifact ) + { + //MavenProject project, String artifactType, String artifactClassifier, File artifactFile + projectHelper.attachArtifact( project, attachArtifactClassifierType, attachArtifactClassifier, + execWarJar ); + } + + if ( extraResources != null ) + { + for ( ExtraResource extraResource : extraResources ) + { + + DirectoryScanner directoryScanner = new DirectoryScanner(); + directoryScanner.setBasedir( extraResource.getDirectory() ); + directoryScanner.addDefaultExcludes(); + directoryScanner.setExcludes( toStringArray( extraResource.getExcludes() ) ); + directoryScanner.setIncludes( toStringArray( extraResource.getIncludes() ) ); + directoryScanner.scan(); + for ( String includeFile : directoryScanner.getIncludedFiles() ) + { + getLog().debug( "include file:" + includeFile ); + os.putArchiveEntry( new JarArchiveEntry( includeFile ) ); + IOUtils.copy( new FileInputStream( new File( extraResource.getDirectory(), includeFile ) ), + os ); + os.closeArchiveEntry(); + } + } + } + + if ( tomcatConfigurationFilesDirectory != null && tomcatConfigurationFilesDirectory.exists() ) + { + // Because its the tomcat default dir for configs + String aConfigOutputDir = "conf/"; + copyDirectoryContentIntoArchive( tomcatConfigurationFilesDirectory, aConfigOutputDir, os ); + } + } + catch ( ManifestException e ) + { + throw new MojoExecutionException( e.getMessage(), e ); + } + catch ( IOException e ) + { + throw new MojoExecutionException( e.getMessage(), e ); + } + catch ( ArchiveException e ) + { + throw new MojoExecutionException( e.getMessage(), e ); + } + catch ( ArtifactNotFoundException e ) + { + throw new MojoExecutionException( e.getMessage(), e ); + } + catch ( ArtifactResolutionException e ) + { + throw new MojoExecutionException( e.getMessage(), e ); + } + finally + { + IOUtils.closeQuietly( os ); + IOUtils.closeQuietly( tmpManifestWriter ); + IOUtils.closeQuietly( execWarJarOutputStream ); + IOUtils.closeQuietly( tmpPropertiesFileOutputStream ); + } + + } +} Propchange: tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractStandaloneWarMojo.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractStandaloneWarMojo.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/StandaloneWarMojo.java URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/StandaloneWarMojo.java?rev=1418074&view=auto ============================================================================== --- tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/StandaloneWarMojo.java (added) +++ tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/StandaloneWarMojo.java Thu Dec 6 21:02:06 2012 @@ -0,0 +1,37 @@ +package org.apache.tomcat.maven.plugin.tomcat7.run; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import org.apache.maven.plugins.annotations.Execute; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; + +/** + * This Mojo will create an executable war file with embedded tomcat that is also capable of being deployed elsewhere + * + * @author Mitch Kyle + * @since 2.1 + */ +@Mojo(name = "standalone-war") +@Execute(phase = LifecyclePhase.PACKAGE) +public class StandaloneWarMojo + extends AbstractStandaloneWarMojo +{ + // no op +} Propchange: tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/StandaloneWarMojo.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/StandaloneWarMojo.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: tomcat/maven-plugin/trunk/tomcat7-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat7Runner.java URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat7-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat7Runner.java?rev=1418074&r1=1418073&r2=1418074&view=diff ============================================================================== --- tomcat/maven-plugin/trunk/tomcat7-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat7Runner.java (original) +++ tomcat/maven-plugin/trunk/tomcat7-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat7Runner.java Thu Dec 6 21:02:06 2012 @@ -38,7 +38,10 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.net.URISyntaxException; import java.net.URL; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -59,12 +62,16 @@ public class Tomcat7Runner // contains war name wars=foo.war,bar.war public static final String WARS_KEY = "wars"; + | + public static final String ARCHIVE_GENERATION_TIMESTAMP_KEY = "generationTimestamp"; public static final String ENABLE_NAMING_KEY = "enableNaming"; public static final String ACCESS_LOG_VALVE_FORMAT_KEY = "accessLogValveFormat"; + public static final String CODE_SOURCE_CONTEXT_PATH = "codeSourceContextPath"; + /** * key of the property which contains http protocol : HTTP/1.1 or org.apache.coyote.http11.Http11NioProtocol */ @@ -95,6 +102,10 @@ public class Tomcat7Runner public File extractDirectoryFile; + public String codeSourceContextPath = null; + + public File codeSourceWar = null; + public String loggerName; Catalina container; @@ -151,6 +162,36 @@ public class Tomcat7Runner } + codeSourceContextPath = runtimeProperties.getProperty( CODE_SOURCE_CONTEXT_PATH ); + if ( codeSourceContextPath != null && !codeSourceContextPath.isEmpty() ) + { + codeSourceWar = AccessController.doPrivileged( new PrivilegedAction<File>() + { + public File run() + { + try + { + File src = + new File( Tomcat7Runner.class.getProtectionDomain().getCodeSource().getLocation().toURI() ); + if ( src.getName().endsWith( ".war" ) ) + { + return src; + } + else + { + debugMessage( "ERROR: Code source is not a war file, ignoring." ); + } + } + catch ( URISyntaxException e ) + { + debugMessage( "ERROR: Could not find code source. " + e.getMessage() ); + + } + return null; + } + } ); + } + // do we have to extract content { if ( !extractDirectoryFile.exists() || resetExtract || archiveTimestampChanged ) @@ -348,6 +389,17 @@ public class Tomcat7Runner } } + if ( codeSourceWar != null ) + { + String baseDir = new File( extractDirectory, "webapps/" + codeSourceWar.getName() ).getAbsolutePath(); + Context context = tomcat.addWebapp( codeSourceContextPath, baseDir ); + URL contextFileUrl = getContextXml( baseDir ); + if ( contextFileUrl != null ) + { + context.setConfigFile( contextFileUrl ); + } + } + tomcat.start(); } @@ -481,6 +533,26 @@ public class Tomcat7Runner } } + //Copy code source to webapps folder + if ( codeSourceWar != null ) + { + FileInputStream inputStream = null; + try + { + File expandFile = new File( extractDirectory, "webapps/" + codeSourceContextPath + ".war" ); + inputStream = new FileInputStream( codeSourceWar ); + debugMessage( "move code source to file:" + expandFile.getPath() ); + expand( inputStream, expandFile ); + } + finally + { + if ( inputStream != null ) + { + inputStream.close(); + } + } + } + // expand tomcat configuration files if there expandConfigurationFile( "catalina.properties", extractDirectoryFile ); expandConfigurationFile( "logging.properties", extractDirectoryFile ); @@ -525,6 +597,11 @@ public class Tomcat7Runner */ private void populateWebAppWarPerContext( String warsValue ) { + if ( warsValue == null ) + { + return; + } + StringTokenizer st = new StringTokenizer( warsValue, ";" ); while ( st.hasMoreTokens() ) { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org