Java – Maven assembly plugin mojoexecutionexception, where dependencyset is outputdirectory
In my Khatami project, I use Maven to manage compilation and package the results into a runnable artifact: the top-level executable shell script, bin / containing executable jars and their dependent jars Please see what I mean here
For reference, this is Khatami's POM The salient part of XML:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/src.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>${project.groupId}.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
And full Src / main / assembly / SRC xml:
<assembly>
<id>dist</id>
<formats>
<format>tar.gz</format>
</formats>
<dependencySets>
<dependencySet>
<outputDirectory>bin</outputDirectory>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>src/main/assembly</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>khatami</include>
</includes>
<fileMode>744</fileMode>
<lineEnding>unix</lineEnding>
<filtered>true</filtered>
</fileSet>
</fileSets>
</assembly>
And assembly attempts:
$mvn clean compile assembly:single [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building khatami 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ khatami --- [INFO] Deleting /home/blt/projects/com/carepilot/repos/khatami/target [INFO] [INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ khatami --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /home/blt/projects/com/carepilot/repos/khatami/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ khatami --- [INFO] Compiling 1 source file to /home/blt/projects/com/carepilot/repos/khatami/target/classes [INFO] [INFO] --- maven-assembly-plugin:2.2-beta-5:single (default-cli) @ khatami --- [INFO] Reading assembly descriptor: src/main/assembly/src.xml [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.721s [INFO] Finished at: Mon Jul 18 13:58:30 EDT 2011 [INFO] Final Memory: 8M/123M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.2-beta-5:single (default-cli) on project khatami: Failed to create assembly: Error adding file 'com.carepilot.khatami:khatami:jar:1.0-SNAPSHOT' to archive: /home/blt/projects/com/carepilot/repos/khatami/target/classes isn't a file. -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors,re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions,please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
What's wrong with me?
Solution
The error message in the relevant section is
Error adding file 'com.carepilot.khatami:khatami:jar:1.0-SNAPSHOT' to archive: /home/blt/projects/com/carepilot/repos/khatami/target/classes isn't a file.
It expects a file and it cannot find it because the package target is not cleaned up after running
If you do MVN clean compilation and packaging: a single one will be built successfully
I will add the assembly: a single target to the package phase so that it will be built automatically
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/src.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>${project.groupId}.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
Make the above changes to the configuration you can publish
mvn clean package
And assembly: a single target will be executed automatically
It is better to use Maven - shade - plugin instead of doing this manually
