diff options
Diffstat (limited to 'org.eclipse.m2e.core')
9 files changed, 118 insertions, 6 deletions
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntimeManager.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntimeManager.java index 437c427b..0eb8df36 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntimeManager.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntimeManager.java @@ -210,7 +210,10 @@ public class MavenRuntimeManager { } List<ClasspathEntry> result = new ArrayList<ClasspathEntry>(); for(String entry : string.split("\\|")) { - result.add(ClasspathEntry.fromExternalForm(entry)); + ClasspathEntry decoded = ClasspathEntry.fromExternalForm(entry); + if(decoded != null) { + result.add(decoded); + } } return result; } @@ -239,8 +242,9 @@ public class MavenRuntimeManager { private AbstractMavenRuntime createRuntime(String name, Preferences preferences) { String location = preferences.get("location", null); - List<ClasspathEntry> extensions = decodeClasspath(preferences.get("extensions", null)); - return new MavenExternalRuntime(name, location); + MavenExternalRuntime runtime = new MavenExternalRuntime(name, location); + runtime.setExtensions(decodeClasspath(preferences.get("extensions", null))); + return runtime; } /** diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/Messages.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/Messages.java index 5c5d95c4..d091b65c 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/Messages.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/Messages.java @@ -246,6 +246,8 @@ public class Messages extends NLS { public static String ProjectConversion_error_duplicate_conversion_participant; + public static String AbstractMavenRuntime_unknownProject; + static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, Messages.class); diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractMavenRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractMavenRuntime.java index f32de7ed..2f9d5e89 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractMavenRuntime.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractMavenRuntime.java @@ -11,9 +11,25 @@ package org.eclipse.m2e.core.internal.launch; +import java.util.ArrayList; import java.util.List; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.osgi.util.NLS; + +import org.eclipse.m2e.core.MavenPlugin; +import org.eclipse.m2e.core.embedder.IMavenLauncherConfiguration; import org.eclipse.m2e.core.embedder.MavenRuntime; +import org.eclipse.m2e.core.internal.IMavenConstants; +import org.eclipse.m2e.core.internal.Messages; +import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; /** @@ -21,8 +37,14 @@ import org.eclipse.m2e.core.embedder.MavenRuntime; */ public abstract class AbstractMavenRuntime implements MavenRuntime { + private static final IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot(); + + private static final IMavenProjectRegistry registry = MavenPlugin.getMavenProjectRegistry(); + private final String name; + private List<ClasspathEntry> extensions; + @Deprecated protected AbstractMavenRuntime() { this.name = null; @@ -38,10 +60,38 @@ public abstract class AbstractMavenRuntime implements MavenRuntime { } public List<ClasspathEntry> getExtensions() { - return null; + return extensions; + } + + public void setExtensions(List<ClasspathEntry> extensions) { + this.extensions = extensions != null && !extensions.isEmpty() ? new ArrayList<ClasspathEntry>(extensions) : null; } public boolean isLegacy() { return name == null; } + + protected void collectExtensions(IMavenLauncherConfiguration collector, IProgressMonitor monitor) + throws CoreException { + if(extensions != null) { + for(ClasspathEntry entry : extensions) { + if(entry instanceof ProjectClasspathEntry) { + collectProject(collector, (ProjectClasspathEntry) entry, monitor); + } + } + } + } + + private void collectProject(IMavenLauncherConfiguration collector, ProjectClasspathEntry entry, + IProgressMonitor monitor) throws CoreException { + IProject project = workspace.getProject(entry.getProject()); + IMavenProjectFacade facade = registry.create(project, monitor); + if(facade == null) { + throw new CoreException(new Status(IStatus.ERROR, IMavenConstants.PLUGIN_ID, NLS.bind( + Messages.AbstractMavenRuntime_unknownProject, entry.getProject()))); + + } + collector.addProjectEntry(facade); + } + } diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractWorkspaceRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractWorkspaceRuntime.java index 61986968..1c592add 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractWorkspaceRuntime.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractWorkspaceRuntime.java @@ -109,6 +109,9 @@ public abstract class AbstractWorkspaceRuntime extends AbstractMavenRuntime { // collector.setMainType(getMainClass(), PLEXUS_CLASSWORLD_NAME); collector.addRealm(PLEXUS_CLASSWORLD_NAME); + + collectExtensions(collector, monitor); + // // plexus.core is the current realm, and now we want the add the SLF4J loggging configuration if // we have a verion>3.1.x Maven-like runtime diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/ClasspathEntry.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/ClasspathEntry.java index 6572cca4..95bb8849 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/ClasspathEntry.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/ClasspathEntry.java @@ -11,13 +11,23 @@ package org.eclipse.m2e.core.internal.launch; + + /** * @since 1.5 */ public abstract class ClasspathEntry { - public abstract String toExternalForm(); + public String toExternalForm() { + if(this instanceof ProjectClasspathEntry) { + return "P/" + ((ProjectClasspathEntry) this).getProject(); + } + throw new IllegalArgumentException(); + } public static ClasspathEntry fromExternalForm(String str) { + if(str.startsWith("P/")) { + return new ProjectClasspathEntry(str.substring(2)); + } return null; } } diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenEmbeddedRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenEmbeddedRuntime.java index 6668e3fa..5f820a46 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenEmbeddedRuntime.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenEmbeddedRuntime.java @@ -105,6 +105,7 @@ public class MavenEmbeddedRuntime extends AbstractMavenRuntime { } collector.addRealm(PLEXUS_CLASSWORLD_NAME); + collectExtensions(collector, monitor); for(String entry : CLASSPATH) { // https://issues.sonatype.org/browse/MNGECLIPSE-2507 if(!entry.contains("plexus-build-api")) { diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenExternalRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenExternalRuntime.java index 47420626..88f4c5a9 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenExternalRuntime.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenExternalRuntime.java @@ -81,13 +81,15 @@ public class MavenExternalRuntime extends AbstractMavenRuntime { return new File(location, "bin/m2.conf"); //$NON-NLS-1$ } - public void createLauncherConfiguration(final IMavenLauncherConfiguration collector, IProgressMonitor monitor) + public void createLauncherConfiguration(final IMavenLauncherConfiguration collector, final IProgressMonitor monitor) throws CoreException { collector.addRealm(IMavenLauncherConfiguration.LAUNCHER_REALM); collector.addArchiveEntry(getLauncherClasspath()); ConfigurationHandler handler = new ConfigurationHandler() { + private String mainRealmName; + public void addImportFrom(String relamName, String importSpec) { throw new UnsupportedOperationException(Messages.MavenExternalRuntime_exc_unsupported); } @@ -109,10 +111,21 @@ public class MavenExternalRuntime extends AbstractMavenRuntime { } public void addRealm(String realmName) { + if(mainRealmName == null) { + throw new IllegalStateException(); + } collector.addRealm(realmName); + if(mainRealmName.equals(realmName)) { + try { + collectExtensions(collector, monitor); + } catch(CoreException ex) { + throw new ExceptionWrapper(ex); + } + } } public void setAppMain(String mainClassName, String mainRealmName) { + this.mainRealmName = mainRealmName; collector.setMainType(mainClassName, mainRealmName); } }; diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/ProjectClasspathEntry.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/ProjectClasspathEntry.java new file mode 100644 index 00000000..e6eb231a --- /dev/null +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/ProjectClasspathEntry.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2014 Takari, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Takari, Inc. - initial API and implementation + *******************************************************************************/ + +package org.eclipse.m2e.core.internal.launch; + +/** + * @since 1.5 + */ +public class ProjectClasspathEntry extends ClasspathEntry { + + private String project; + + public ProjectClasspathEntry(String project) { + this.project = project; + } + + public String getProject() { + return project; + } +} diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/messages.properties b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/messages.properties index 227ff9e7..b349539f 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/messages.properties +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/messages.properties @@ -1,4 +1,5 @@ AbstractLifecycleMapping_could_not_update_project_configuration=Could not update project {0} configuration +AbstractMavenRuntime_unknownProject=Not a Maven project {0} AbstractProjectConfigurator_error_missing_nature=Project does not have required nature AbstractTransferListenerAdapter_4=0% {0} AbstractTransferListenerAdapter_byte=B |