docker-maven-plugin icon indicating copy to clipboard operation
docker-maven-plugin copied to clipboard

NPE from Assembly plugin when POM packaging is used

Open sadovnikov opened this issue 6 years ago • 6 comments

Description

We use d-m-p with assembly file and everything is working great if default JAR Maven packaging is used. However this Maven module is meant for building docker image only, it does not contain any code. Attempts to use <packaging>pom</packaging> to avoid warnings about missing sources result in NPE thrown from Assembly plugin (exception trace is below).

The exception is thrown from code of Assembly plugin, but it can be used directly in modules with POM packaging - tested with version 3.1.0

Info

  • d-m-p version : 0.28.0
  • Maven version (mvn -v) : 3.5.2

Exception trace

Caused by: org.apache.maven.plugin.PluginExecutionException: Execution docker-build of goal io.fabric8:docker-maven-plugin:0.28.0:build failed.
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:145)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:309)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:194)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:107)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:955)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:290)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:194)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
Caused by: java.lang.NullPointerException
    at org.apache.maven.plugins.assembly.archive.archiver.AssemblyProxyArchiver$DefaultFileInfo.isFile (AssemblyProxyArchiver.java:1025)
    at org.apache.maven.plugins.assembly.filter.ComponentsXmlArchiverFileFilter.isSelected (ComponentsXmlArchiverFileFilter.java:179)
    at org.apache.maven.plugins.assembly.archive.archiver.AssemblyProxyArchiver.acceptFile (AssemblyProxyArchiver.java:794)
    at org.apache.maven.plugins.assembly.archive.archiver.AssemblyProxyArchiver.addFile (AssemblyProxyArchiver.java:418)
    at org.apache.maven.plugins.assembly.archive.task.AddArtifactTask.asFile (AddArtifactTask.java:175)
    at org.apache.maven.plugins.assembly.archive.task.AddArtifactTask.execute (AddArtifactTask.java:132)
    at org.apache.maven.plugins.assembly.archive.task.AddDependencySetsTask.addNormalArtifact (AddDependencySetsTask.java:263)
    at org.apache.maven.plugins.assembly.archive.task.AddDependencySetsTask.addDependencySet (AddDependencySetsTask.java:175)
    at org.apache.maven.plugins.assembly.archive.task.AddDependencySetsTask.execute (AddDependencySetsTask.java:120)
    at org.apache.maven.plugins.assembly.archive.phase.DependencySetAssemblyPhase.execute (DependencySetAssemblyPhase.java:104)
    at org.apache.maven.plugins.assembly.archive.DefaultAssemblyArchiver.createArchive (DefaultAssemblyArchiver.java:181)
    at io.fabric8.maven.docker.assembly.DockerAssemblyManager.createAssemblyArchive (DockerAssemblyManager.java:466)
    at io.fabric8.maven.docker.assembly.DockerAssemblyManager.createDockerTarArchive (DockerAssemblyManager.java:115)
    at io.fabric8.maven.docker.service.ArchiveService.createArchive (ArchiveService.java:123)
    at io.fabric8.maven.docker.service.ArchiveService.createArchive (ArchiveService.java:118)
    at io.fabric8.maven.docker.service.BuildService.buildImage (BuildService.java:113)
    at io.fabric8.maven.docker.service.BuildService.buildImage (BuildService.java:61)
    at io.fabric8.maven.docker.BuildMojo.buildAndTag (BuildMojo.java:73)
    at io.fabric8.maven.docker.BuildMojo.processImageConfig (BuildMojo.java:104)
    at io.fabric8.maven.docker.BuildMojo.executeInternal (BuildMojo.java:60)
    at io.fabric8.maven.docker.AbstractDockerMojo.execute (AbstractDockerMojo.java:225)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:154)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:146)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:309)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:194)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:107)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:955)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:290)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:194)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:356)
  • If it's a bug, how to reproduce :

pom.xml, removal of <packaging>pom</packaging> line helps to avoid NPE, but adds warnings from maven-jar-plugin

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>xxxxx.xxxx.xxxx</groupId>
    <artifactId>docker-sample</artifactId>
    <packaging>pom</packaging>

    <name>Docker Image Sample</name>
    <description>Hello-world application to run in docker container</description>

    <properties>
        <result.service.jar>myservice.jar</result.service.jar>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.28.0</version>
                <executions>
                    <execution>
                        <id>docker-build</id>
                        <!-- by default docker build happens at install phase -->
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default</id>
                        <goals>
                            <goal>push</goal>
                            <goal>start</goal>
                            <!-- always use stop because it also removes exited container -->
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <images>
                        <image>
                            <name>${docker.image.prefix}/${project.artifactId}:${project.version}</name>
                            <build>
                                <!-- see documentation on http://dmp.fabric8.io/#docker:build -->
                                <dockerFileDir>${project.basedir}/src/main/docker</dockerFileDir>
                                <assembly>
                                    <!-- assembly-like plugin prepares all files in "maven" folder next to filtered "Dockerfile" -->
                                    <descriptor>${project.basedir}/src/main/docker/docker-assembly.xml</descriptor>
                                </assembly>
                            </build>
                            <run>
                                <wait>
                                    <exit>0</exit>
                                    <!-- give a minute to complete the test -->
                                    <time>5000</time>
                                </wait>
                                <log>
                                    <prefix>%c&gt; </prefix>
                                    <color>cyan</color>
                                </log>
                            </run>
                        </image>
                    </images>
                </configuration>
            </plugin>

        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>xxxxx.xxxx.xxxx</groupId>
            <artifactId>docker-playground-java-app</artifactId>
            <version>0.0.27-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

referenced in pom.xml docker-assembly.xml

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">

    <baseDirectory>.</baseDirectory>

    <dependencySets>
        <dependencySet>
            <includes>
                <include>*:docker-playground-java-app</include>
            </includes>
            <outputFileNameMapping>${result.service.jar}</outputFileNameMapping>
            <unpack>false</unpack>
        </dependencySet>
    </dependencySets>

</assembly>

sadovnikov avatar Jan 02 '19 13:01 sadovnikov

I have the same issue with d-m-p 0.30.0. Looks like it's related to https://issues.apache.org/jira/browse/MENFORCER-308 - I have the issue after add maven-enforce-plugin to my root pom.

fidget83 avatar May 15 '19 11:05 fidget83

I was able to ~~fix this~~ break the build in a different way (see below) by updating the assembly plugin dependency to 3.1.1:

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.31.0</version>
    <!-- ... -->
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.1</version>
        </dependency>
    </dependencies>
</plugin>

daniel-huss avatar Oct 16 '19 12:10 daniel-huss

@daniel-huss : Thanks for your feedback. Could you please raise a PR to update this dependency if you have time?

rohanKanojia avatar Oct 16 '19 12:10 rohanKanojia

Unfortunately, using version 3.1.1 breaks my build in a different way. The assembly plugin now reports an empty set of dependencies, which breaks <dependencySet>:

[DEBUG] Dependencies for project: my-group:my-docker-image:pom:0.4.0-SNAPSHOT are:

(just an empty line)

Removing the plugin <dependencies> section reverts the situation to

[DEBUG] Dependencies for project: my-group:my-docker-image:pom:0.4.0-SNAPSHOT are:
my-group:my-app-standalone:jar:0.4.0-SNAPSHOT:provided
[DEBUG] Resolving project dependencies transitively.
...

However, disabling our maven-enforcer-plugin execution has fixed the issue completely for me:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <executions>
                    <execution>
                        <id>enforce-maven-3</id><!-- Defined in our base POM  -->
                        <phase>none</phase>
                    </execution>
                </executions>
                <!-- Note that using <configuration><skip>true  is not enough! -->
            </plugin>

daniel-huss avatar Oct 16 '19 17:10 daniel-huss

Experienced the same issue with docker-maven-plugin 0.40.2, fixed it by forcing the assembly plugin version to 3.1.1.

sdehors-ibm avatar Aug 10 '22 16:08 sdehors-ibm

@rohanKanojia do you think we would be able to update the assembly plugin without breaking something ?

rhuss avatar Aug 11 '22 06:08 rhuss

Bug is in docker-m-p - fixed in mentioned PR

slawekjaranowski avatar Oct 17 '22 14:10 slawekjaranowski