Search in sources :

Example 1 with AbstractBuildParticipant2

use of org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant2 in project bndtools by bndtools.

the class BndConfigurator method getBuildParticipant.

@Override
public AbstractBuildParticipant getBuildParticipant(final IMavenProjectFacade projectFacade, MojoExecution execution, IPluginExecutionMetadata executionMetadata) {
    return new MojoExecutionBuildParticipant(execution, true, true) {

        @Override
        public Set<IProject> build(int kind, IProgressMonitor monitor) throws Exception {
            // build mojo like normal
            final Set<IProject> build = super.build(kind, monitor);
            // nothing to do if configuration build
            if (kind == AbstractBuildParticipant2.PRECONFIGURE_BUILD) {
                return build;
            }
            final IProject project = projectFacade.getProject();
            IMarker[] imarkers = project.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
            if (imarkers != null && Arrays.stream(imarkers).map(m -> m.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO)).anyMatch(s -> s == IMarker.SEVERITY_ERROR)) {
                // there are compile errors, don't build jar
                return build;
            }
            // now we make sure jar is built in separate job, doing this during maven builder will throw lifecycle
            // errors
            Job job = new WorkspaceJob("Executing " + project.getName() + " jar:jar goal") {

                @Override
                public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
                    SubMonitor progress = SubMonitor.convert(monitor, 3);
                    execJarMojo(projectFacade, progress.newChild(1, SubMonitor.SUPPRESS_NONE));
                    // Find the maven output directory (usually "target")
                    MavenProject mvnProject = getMavenProject(projectFacade, progress.newChild(1));
                    IPath buildDirPath = Path.fromOSString(mvnProject.getBuild().getDirectory());
                    IPath projectPath = project.getLocation();
                    IPath relativeBuildDirPath = buildDirPath.makeRelativeTo(projectPath);
                    IFolder buildDir = project.getFolder(relativeBuildDirPath);
                    if (buildDir != null) {
                        // TODO: there *may* be a remaining issue here if a source-generation plugin gets triggered
                        // by the above invocation of the jar:jar goal.
                        // This could cause Eclipse to think that the Java sources are dirty and queue the project
                        // for rebuilding, thus entering an infinite loop.
                        // One solution would be to find the output artifact jar and refresh ONLY that. However we
                        // have not been able to create the condition we
                        // are worried about so we are deferring any extra work on this until it's shown to be a
                        // real problem.
                        buildDir.refreshLocal(IResource.DEPTH_INFINITE, progress.newChild(1));
                    } else {
                        Logger.getLogger(BndConfigurator.class).logError(String.format("Project build folder '%s' does not exist, or is not a child of the project path '%s'", buildDirPath, projectPath), null);
                        progress.worked(1);
                    }
                    return Status.OK_STATUS;
                }
            };
            job.setRule(project);
            job.schedule();
            return build;
        }
    };
}
Also used : Arrays(java.util.Arrays) MavenExecutionPlan(org.apache.maven.lifecycle.MavenExecutionPlan) IFolder(org.eclipse.core.resources.IFolder) AbstractBuildParticipant(org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant) SubMonitor(org.eclipse.core.runtime.SubMonitor) AbstractProjectConfigurator(org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator) CoreException(org.eclipse.core.runtime.CoreException) AtomicReference(java.util.concurrent.atomic.AtomicReference) ProjectRegistryManager(org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager) ArrayList(java.util.ArrayList) ResolverConfiguration(org.eclipse.m2e.core.project.ResolverConfiguration) IStatus(org.eclipse.core.runtime.IStatus) Component(org.osgi.service.component.annotations.Component) MavenPluginActivator(org.eclipse.m2e.core.internal.MavenPluginActivator) IProject(org.eclipse.core.resources.IProject) MavenProject(org.apache.maven.project.MavenProject) IPath(org.eclipse.core.runtime.IPath) Jar(aQute.bnd.osgi.Jar) IMarker(org.eclipse.core.resources.IMarker) ILogger(org.bndtools.api.ILogger) Analyzer(aQute.bnd.osgi.Analyzer) Job(org.eclipse.core.runtime.jobs.Job) IMavenProjectFacade(org.eclipse.m2e.core.project.IMavenProjectFacade) IPluginExecutionMetadata(org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata) Collection(java.util.Collection) MojoExecution(org.apache.maven.plugin.MojoExecution) BndProjectInfo(org.bndtools.build.api.IProjectDecorator.BndProjectInfo) Set(java.util.Set) Status(org.eclipse.core.runtime.Status) MojoExecutionBuildParticipant(org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant) File(java.io.File) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) IJavaModelMarker(org.eclipse.jdt.core.IJavaModelMarker) WorkspaceJob(org.eclipse.core.resources.WorkspaceJob) AbstractBuildParticipant2(org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant2) List(java.util.List) IMavenExecutionContext(org.eclipse.m2e.core.embedder.IMavenExecutionContext) Packages(aQute.bnd.osgi.Packages) ICallable(org.eclipse.m2e.core.embedder.ICallable) IResource(org.eclipse.core.resources.IResource) Path(org.eclipse.core.runtime.Path) MavenPlugin(org.eclipse.m2e.core.MavenPlugin) Logger(org.bndtools.api.Logger) IProjectDecorator(org.bndtools.build.api.IProjectDecorator) ProjectConfigurationRequest(org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest) Reference(org.osgi.service.component.annotations.Reference) IMaven(org.eclipse.m2e.core.embedder.IMaven) IPath(org.eclipse.core.runtime.IPath) WorkspaceJob(org.eclipse.core.resources.WorkspaceJob) SubMonitor(org.eclipse.core.runtime.SubMonitor) IProject(org.eclipse.core.resources.IProject) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) MavenProject(org.apache.maven.project.MavenProject) IMarker(org.eclipse.core.resources.IMarker) Job(org.eclipse.core.runtime.jobs.Job) WorkspaceJob(org.eclipse.core.resources.WorkspaceJob) MojoExecutionBuildParticipant(org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant) IFolder(org.eclipse.core.resources.IFolder)

Aggregations

Analyzer (aQute.bnd.osgi.Analyzer)1 Jar (aQute.bnd.osgi.Jar)1 Packages (aQute.bnd.osgi.Packages)1 File (java.io.File)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 Collection (java.util.Collection)1 List (java.util.List)1 Set (java.util.Set)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 MavenExecutionPlan (org.apache.maven.lifecycle.MavenExecutionPlan)1 MojoExecution (org.apache.maven.plugin.MojoExecution)1 MavenProject (org.apache.maven.project.MavenProject)1 ILogger (org.bndtools.api.ILogger)1 Logger (org.bndtools.api.Logger)1 IProjectDecorator (org.bndtools.build.api.IProjectDecorator)1 BndProjectInfo (org.bndtools.build.api.IProjectDecorator.BndProjectInfo)1 IFolder (org.eclipse.core.resources.IFolder)1 IMarker (org.eclipse.core.resources.IMarker)1 IProject (org.eclipse.core.resources.IProject)1