Author: fgiust Date: Mon Jul 17 12:47:50 2006 New Revision: 422820 URL: http://svn.apache.org/viewvc?rev=422820&view=rev Log: PR: MECLIPSE-92 Allow .classpath generation for plugin-development support Submitted by: Reinhard Poetz Reviewed by: Fabrizio Giustina
Added: maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseOSGiManifestWriter.java (with props) maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/ maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/classpath maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/pom.xml (with props) maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/project Modified: maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/EclipsePlugin.java maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseClasspathWriter.java maven/plugins/trunk/maven-eclipse-plugin/src/main/resources/org/apache/maven/plugin/eclipse/messages.properties maven/plugins/trunk/maven-eclipse-plugin/src/test/java/org/apache/maven/plugin/eclipse/EclipsePluginTest.java Modified: maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/EclipsePlugin.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/EclipsePlugin.java?rev=422820&r1=422819&r2=422820&view=diff ============================================================================== --- maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/EclipsePlugin.java (original) +++ maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/EclipsePlugin.java Mon Jul 17 12:47:50 2006 @@ -16,10 +16,19 @@ * limitations under the License. */ +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.model.Resource; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.eclipse.writers.EclipseClasspathWriter; +import org.apache.maven.plugin.eclipse.writers.EclipseOSGiManifestWriter; import org.apache.maven.plugin.eclipse.writers.EclipseProjectWriter; import org.apache.maven.plugin.eclipse.writers.EclipseSettingsWriter; import org.apache.maven.plugin.eclipse.writers.EclipseWtpComponent15Writer; @@ -32,14 +41,6 @@ import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.StringUtils; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - /** * Generates the following eclipse configuration files: * <ul> @@ -71,14 +72,22 @@ private static final String BUILDER_WST_COMPONENT_STRUCTURAL = "org.eclipse.wst.common.modulecore.ComponentStructuralBuilder"; //$NON-NLS-1$ + private static final String BUILDER_PDE_MANIFEST = "org.eclipse.pde.ManifestBuilder"; //$NON-NLS-1$ + + private static final String BUILDER_PDE_SCHEMA = "org.eclipse.pde.SchemaBuilder"; //$NON-NLS-1$ + private static final String NATURE_WST_MODULE_CORE_NATURE = "org.eclipse.wst.common.modulecore.ModuleCoreNature"; //$NON-NLS-1$ private static final String NATURE_JDT_CORE_JAVA = "org.eclipse.jdt.core.javanature"; //$NON-NLS-1$ private static final String NATURE_JEM_WORKBENCH_JAVA_EMF = "org.eclipse.jem.workbench.JavaEMFNature"; //$NON-NLS-1$ + private static final String NATURE_PDE_PLUGIN = "org.eclipse.pde.PluginNature"; //$NON-NLS-1$ + private static final String COMMON_PATH_JDT_LAUNCHING_JRE_CONTAINER = "org.eclipse.jdt.launching.JRE_CONTAINER"; //$NON-NLS-1$ + private static final String REQUIRED_PLUGINS_CONTAINER = "org.eclipse.pde.core.requiredPlugins"; //$NON-NLS-1$ + // warning, order is important for binary search public static final String[] WTP_SUPPORTED_VERSIONS = new String[] { "1.0", "1.5", "R7", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ @@ -207,6 +216,30 @@ private String wtpversion; /** + * Is it an PDE project? If yes, the plugin adds the necessary natures and build commands to + * the .project file. Additionally it copies all libraries to a project local directory and + * references them instead of referencing the files in the local Maven repository. It also + * ensured that the "Bundle-Classpath" in META-INF/MANIFEST.MF is synchronized. + * + * @parameter expression="${eclipse.pde}" default-value="false" + */ + private boolean pde; + + /** + * The relative path of the manifest file + * + * @parameter expression="${eclipse.manifest}" default-value="${basedir}/META-INF/MANIFEST.MF" + */ + private File manifest; + + /** + * The directory of local libraries + * + * @parameter expression="${eclipse.pdeLibDir}" default-value="${basedir}/lib" + */ + private String pdeLibDir; + + /** * Not a plugin parameter. Are we working with wtp r7? */ private boolean wtpR7; @@ -549,7 +582,15 @@ new EclipseClasspathWriter( getLog(), eclipseProjectDir, project, deps ).write( projectBaseDir, sourceDirs, classpathContainers, localRepository, - buildOutputDirectory ); + buildOutputDirectory, pde, + pdeLibDir ); + } + + if ( pde ) + { + this.getLog().info( "The Maven Eclipse plugin runs in 'pde'-mode." ); + new EclipseOSGiManifestWriter( getLog(), eclipseProjectDir, project, deps ) + .write( this.manifest, pdeLibDir ); } getLog().info( Messages.getString( "EclipsePlugin.wrote", new Object[] { //$NON-NLS-1$ @@ -589,12 +630,22 @@ } } + if ( pde ) + { + projectnatures.add( NATURE_PDE_PLUGIN ); + } + } private void fillDefaultClasspathContainers( String packaging ) { classpathContainers = new ArrayList(); classpathContainers.add( COMMON_PATH_JDT_LAUNCHING_JRE_CONTAINER ); + + if ( pde ) + { + classpathContainers.add( REQUIRED_PLUGINS_CONTAINER ); + } } private void fillDefaultBuilders( String packaging ) @@ -619,6 +670,12 @@ if ( wtpR7 ) { buildcommands.add( BUILDER_WST_COMPONENT_STRUCTURAL_DEPENDENCY_RESOLVER ); // WTP 0.7 builder + } + + if ( pde ) + { + buildcommands.add( BUILDER_PDE_MANIFEST ); + buildcommands.add( BUILDER_PDE_SCHEMA ); } } Modified: maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseClasspathWriter.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseClasspathWriter.java?rev=422820&r1=422819&r2=422820&view=diff ============================================================================== --- maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseClasspathWriter.java (original) +++ maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseClasspathWriter.java Mon Jul 17 12:47:50 2006 @@ -30,6 +30,7 @@ import org.apache.maven.plugin.ide.IdeUtils; import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter; @@ -77,6 +78,26 @@ private static final String ATTR_KIND = "kind"; //$NON-NLS-1$ /** + * Attribute value for kind: var + */ + private static final String ATTR_VAR = "var"; //$NON-NLS-1$ + + /** + * Attribute value for kind: lib + */ + private static final String ATTR_LIB = "lib"; //$NON-NLS-1$ + + /** + * Attribute value for kind: src + */ + private static final String ATTR_SRC = "src"; //$NON-NLS-1$ + + /** + * Attribute value for kind: src + */ + private static final String ATTR_CON = "con"; //$NON-NLS-1$ + + /** * Element for classpathentry. */ private static final String ELT_CLASSPATHENTRY = "classpathentry"; //$NON-NLS-1$ @@ -97,7 +118,8 @@ } public void write( File projectBaseDir, EclipseSourceDir[] sourceDirs, List classpathContainers, - ArtifactRepository localRepository, File buildOutputDirectory ) + ArtifactRepository localRepository, File buildOutputDirectory, boolean inPdeMode, + String pdeLibDir ) throws MojoExecutionException { @@ -170,7 +192,7 @@ if ( dep.isAddedToClasspath() ) { - addDependency( writer, dep, localRepository ); + addDependency( writer, dep, localRepository, projectBaseDir, inPdeMode, pdeLibDir ); } } @@ -180,7 +202,8 @@ } - private void addDependency( XMLWriter writer, IdeDependency dep, ArtifactRepository localRepository ) + private void addDependency( XMLWriter writer, IdeDependency dep, ArtifactRepository localRepository, + File projectBaseDir, boolean inPdeMode, String pdeLibDir ) throws MojoExecutionException { @@ -189,10 +212,10 @@ String sourcepath = null; String javadocpath = null; - if ( dep.isReferencedProject() ) + if ( dep.isReferencedProject() && !inPdeMode ) { path = "/" + dep.getArtifactId(); //$NON-NLS-1$ - kind = "src"; //$NON-NLS-1$ + kind = ATTR_SRC; } else { @@ -214,20 +237,53 @@ new Object[] { dep.getArtifactId(), path } ) ); } - kind = "lib"; //$NON-NLS-1$ + kind = ATTR_LIB; } else { File localRepositoryFile = new File( localRepository.getBasedir() ); - String fullPath = artifactPath.getPath(); + // if the dependency is not provided and the plugin runs in "pde mode", the dependency is + // added to the Bundle-Classpath: + if ( inPdeMode && !dep.isProvided() ) + { + try + { + // TODO problem with reactor build + File libsDir = new File( projectBaseDir, pdeLibDir ); + if ( !libsDir.exists() ) + { + libsDir.mkdirs(); + } + FileUtils.copyFileToDirectory( dep.getFile(), libsDir ); + + } + catch ( IOException e ) + { + throw new MojoExecutionException( Messages.getString( "EclipsePlugin.cantcopyartifact", dep + .getArtifactId() ) ); + } + path = pdeLibDir + "/" + dep.getFile().getName(); + kind = ATTR_LIB; + } + // running in PDE mode and the dependency is provided means, that it is provided by + // the target platform. This case is covered by adding the plugin container + else if ( inPdeMode && dep.isProvided() ) + { + return; + } + else + { + String fullPath = artifactPath.getPath(); - path = "M2_REPO/" //$NON-NLS-1$ - + IdeUtils.toRelativeAndFixSeparator( localRepositoryFile, new File( fullPath ), false ); + path = M2_REPO + "/" //$NON-NLS-1$ + + IdeUtils.toRelativeAndFixSeparator( localRepositoryFile, new File( fullPath ), false ); + kind = ATTR_VAR; //$NON-NLS-1$ + } if ( dep.getSourceAttachment() != null ) { - sourcepath = "M2_REPO/" //$NON-NLS-1$ + sourcepath = M2_REPO + "/" //$NON-NLS-1$ + IdeUtils.toRelativeAndFixSeparator( localRepositoryFile, dep.getSourceAttachment(), false ); } @@ -239,18 +295,17 @@ "\\", "/" ); //$NON-NLS-1$ //$NON-NLS-2$ } - kind = "var"; //$NON-NLS-1$ } } - writer.startElement( "classpathentry" ); //$NON-NLS-1$ - writer.addAttribute( "kind", kind ); //$NON-NLS-1$ - writer.addAttribute( "path", path ); //$NON-NLS-1$ + writer.startElement( ELT_CLASSPATHENTRY ); + writer.addAttribute( ATTR_KIND, kind ); + writer.addAttribute( ATTR_PATH, path ); if ( sourcepath != null ) { - writer.addAttribute( "sourcepath", sourcepath ); //$NON-NLS-1$ + writer.addAttribute( ATTR_SOURCEPATH, sourcepath ); } else if ( javadocpath != null ) { Added: maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseOSGiManifestWriter.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseOSGiManifestWriter.java?rev=422820&view=auto ============================================================================== --- maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseOSGiManifestWriter.java (added) +++ maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseOSGiManifestWriter.java Mon Jul 17 12:47:50 2006 @@ -0,0 +1,155 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * 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 org.apache.maven.plugin.eclipse.writers; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.eclipse.Messages; +import org.apache.maven.plugin.ide.IdeDependency; +import org.apache.maven.plugin.logging.Log; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.util.IOUtil; + +/** + * The <code>EclipseOSGiManifestWriter</code> ensures that value of the "Bundle-Classpath" property + * in META-INF/MANIFEST.MF is synchronized with the POM by adding all dependencies that don't have the + * scope provided. + */ +public class EclipseOSGiManifestWriter + extends AbstractEclipseResourceWriter +{ + + public final static String ENTRY_BUNDLE_CLASSPATH = "Bundle-ClassPath:"; + + public EclipseOSGiManifestWriter( Log log, File eclipseProjectDir, MavenProject project, IdeDependency[] deps ) + { + super( log, eclipseProjectDir, project, deps ); + } + + public void write( File manifestFile, String libdir ) + throws MojoExecutionException + { + // check for existence + if ( !manifestFile.exists() ) + { + getLog().warn( + Messages.getString( "EclipseOSGiManifestWriter.nomanifestfile", manifestFile + .getAbsolutePath() ) ); + return; + } + + StringBuffer manifestSb = rewriteManifest( manifestFile, libdir ); + FileWriter fos = null; + try + { + fos = new FileWriter( manifestFile ); + fos.write( manifestSb.toString() ); + } + catch ( FileNotFoundException e ) + { + throw new MojoExecutionException( Messages.getString( "cantwritetofile", manifestFile.getAbsolutePath() ) ); + } + catch ( IOException e ) + { + throw new MojoExecutionException( Messages.getString( "cantwritetofile", manifestFile.getAbsolutePath() ), + e ); + } + finally + { + IOUtil.close( fos ); + } + } + + protected StringBuffer rewriteManifest( File manifestFile, String libdir ) + throws MojoExecutionException + { + boolean inBundleClasspathEntry = false; + StringBuffer manifestSb = new StringBuffer(); + try + { + BufferedReader in = new BufferedReader( new FileReader( manifestFile ) ); + String str; + while ( ( str = in.readLine() ) != null ) + { + if ( inBundleClasspathEntry && str.indexOf( ":" ) > -1 ) + { + inBundleClasspathEntry = false; + if ( str.length() > 0 ) + { + manifestSb.append( str + "\n" ); + } + } + else if ( str.indexOf( ENTRY_BUNDLE_CLASSPATH ) > -1 ) + { + inBundleClasspathEntry = true; + } + else if ( inBundleClasspathEntry ) + { + // skip it + } + else + { + manifestSb.append( str + "\n" ); + } + } + in.close(); + } + catch ( IOException e ) + { + throw new MojoExecutionException( Messages.getString( "cantreadfile", manifestFile.getAbsolutePath() ) ); + } + manifestSb.append( addBundleClasspathEntries( libdir ) ); + // OSGi manifest headers need to end with a line break + manifestSb.append( "\n" ); + return manifestSb; + } + + /** + * Add all libraries that don't have the scope "provided" to the "Bundle-Classpath". + */ + protected String addBundleClasspathEntries( String libdir ) + { + StringBuffer bundleClasspathSb = new StringBuffer( ENTRY_BUNDLE_CLASSPATH ); + int countAddedLibs = 0; + for ( int i = 0; i < this.deps.length; i++ ) + { + if ( !this.deps[i].isProvided() && !this.deps[i].isReferencedProject() ) + { + if ( countAddedLibs != 0 ) + { + // TODO problems with line endings might appear + bundleClasspathSb.append( ",\n" ); + } + System.out.println( "artifact: " + this.deps[i].getArtifactId() ); + bundleClasspathSb.append( " " + libdir + "/" + this.deps[i].getFile().getName() + "" ); + countAddedLibs++; + } + } + // only insert the name of the property if there are local libraries + if ( countAddedLibs > 0 ) + { + return bundleClasspathSb.toString(); + } + return ""; + } + +} \ No newline at end of file Propchange: maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseOSGiManifestWriter.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-eclipse-plugin/src/main/java/org/apache/maven/plugin/eclipse/writers/EclipseOSGiManifestWriter.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: maven/plugins/trunk/maven-eclipse-plugin/src/main/resources/org/apache/maven/plugin/eclipse/messages.properties URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-eclipse-plugin/src/main/resources/org/apache/maven/plugin/eclipse/messages.properties?rev=422820&r1=422819&r2=422820&view=diff ============================================================================== --- maven/plugins/trunk/maven-eclipse-plugin/src/main/resources/org/apache/maven/plugin/eclipse/messages.properties (original) +++ maven/plugins/trunk/maven-eclipse-plugin/src/main/resources/org/apache/maven/plugin/eclipse/messages.properties Mon Jul 17 12:47:50 2006 @@ -26,9 +26,13 @@ EclipseClasspathWriter.lookingforsources=Looking for source archive for artifact {0} EclipseClasspathWriter.sourcesavailable=Sources attachment for artifact {0} set to {1} - + EclipseProjectWriter.notafile=Not adding a file link to {0}; it is not a file EclipseCleanMojo.deleting=Deleting {0} file... EclipseCleanMojo.failedtodelete=Failed to delete {0} file: {0} -EclipseCleanMojo.nofilefound=No {0} file found \ No newline at end of file +EclipseCleanMojo.nofilefound=No {0} file found + +EclipseOSGiManifestWriter.nomanifestfile=The references manifest file doesn''t exist, plugin dependencies will not be updated: {0} + +IdeDependency.cantreadfile=Unable to read file: {0} \ No newline at end of file Modified: maven/plugins/trunk/maven-eclipse-plugin/src/test/java/org/apache/maven/plugin/eclipse/EclipsePluginTest.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-eclipse-plugin/src/test/java/org/apache/maven/plugin/eclipse/EclipsePluginTest.java?rev=422820&r1=422819&r2=422820&view=diff ============================================================================== --- maven/plugins/trunk/maven-eclipse-plugin/src/test/java/org/apache/maven/plugin/eclipse/EclipsePluginTest.java (original) +++ maven/plugins/trunk/maven-eclipse-plugin/src/test/java/org/apache/maven/plugin/eclipse/EclipsePluginTest.java Mon Jul 17 12:47:50 2006 @@ -193,4 +193,14 @@ testProject( "project-20" ); } + /** + * PDE support. + * @throws Exception any exception thrown during test + */ + public void testProject21() + throws Exception + { + testProject( "project-21" ); + } + } Added: maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/classpath URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/classpath?rev=422820&view=auto ============================================================================== --- maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/classpath (added) +++ maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/classpath Mon Jul 17 12:47:50 2006 @@ -0,0 +1,5 @@ +<classpath> + <classpathentry kind="output" path="target/classes"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> +</classpath> \ No newline at end of file Added: maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/pom.xml URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/pom.xml?rev=422820&view=auto ============================================================================== --- maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/pom.xml (added) +++ maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/pom.xml Mon Jul 17 12:47:50 2006 @@ -0,0 +1,19 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>eclipse</groupId> + <artifactId>maven-eclipse-plugin-test-project-21</artifactId> + <version>21</version> + <name>maven-eclipse-plugin-test-project-21</name> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <configuration> + <pde>true</pde> + </configuration> + </plugin> + </plugins> + </build> +</project> Propchange: maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/pom.xml ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/project URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/project?rev=422820&view=auto ============================================================================== --- maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/project (added) +++ maven/plugins/trunk/maven-eclipse-plugin/src/test/resources/projects/project-21/project Mon Jul 17 12:47:50 2006 @@ -0,0 +1,23 @@ +<projectDescription> + <name>maven-eclipse-plugin-test-project-21</name> + <comment/> + <projects/> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments/> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments/> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments/> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>org.eclipse.pde.PluginNature</nature> + </natures> +</projectDescription> \ No newline at end of file