{"id":62987,"date":"2022-03-17T09:00:29","date_gmt":"2022-03-17T09:00:29","guid":{"rendered":"https:\/\/www.cryptocabaret.com\/?p=62987"},"modified":"2022-03-17T09:00:29","modified_gmt":"2022-03-17T09:00:29","slug":"use-maven-to-manage-your-java-dependencies","status":"publish","type":"post","link":"https:\/\/www.cryptocabaret.com\/?p=62987","title":{"rendered":"Use Maven to manage your Java dependencies"},"content":{"rendered":"<p><span class=\"field field--name-title field--type-string field--label-hidden\">Use Maven to manage your Java dependencies<\/span><br \/>\n<span class=\"field field--name-uid field--type-entity-reference field--label-hidden\"><a title=\"View user profile.\" href=\"https:\/\/opensource.com\/users\/seth\" class=\"username\">Seth Kenlon<\/a><\/span><br \/>\n<span class=\"field field--name-created field--type-created field--label-hidden\">Thu, 03\/17\/2022 &#8211; 03:00<\/span><\/p>\n<div data-drupal-selector=\"rate-node-69661\" class=\"rate-widget-thumbs-up\">\n<div class=\"rate-thumbs-up-btn-up rate-thumbs-up-btn-up vote-pending\">Up<\/div>\n<div class=\"rate-score\"><a href=\"https:\/\/opensource.com\/user\/register?absolute=1\">Register<\/a> or <a href=\"https:\/\/opensource.com\/user\/login?current=\/rss.xml&amp;absolute=1\">Login<\/a> to like.<\/div>\n<\/div>\n<div class=\"clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item\">\n<p>As an open source enthusiast, I&#8217;ve used dozens (hundreds?) of libraries that are well beyond my skill or interest as a programmer. For a lot of people, including me, the available libraries are one of the things that makes a particular programming language worth using.<\/p>\n<p>An open source library represents hours and days you don&#8217;t have to work on a problem that&#8217;s either not central to your project or, conversely, <em>so<\/em> central that your project would be otherwise out of reach. Better still, it&#8217;s code you don&#8217;t have to maintain\u2014unless it&#8217;s so important to you that you decide to contribute to it.<\/p>\n<p>Because open source libraries are a vital component of open source programming, most programming languages have a convenient way to ensure they&#8217;re easy to include in your codebase.<\/p>\n<p>There are several ways to manage libraries in Java, but the one I use is Maven.<\/p>\n<p><a href=\"http:\/\/maven.apache.org\/\" target=\"blank\" rel=\"noopener\">Maven<\/a> is a code management framework that helps you keep track of dependencies, build targets, reporting, and documentation, all from a central location. That central location is a Project Object Model (POM) file, which is written in XML to describe the requirements and expectations of your project.<\/p>\n<p>When you decide to update a library, you can update just your <code>pom.xml<\/code> file.<\/p>\n<p>Should you add a debug build to your project, add it as a target in <code>pom.xml<\/code>.<\/p>\n<p>When you upgrade to a new Java Virtual Machine (JVM), do it in <code>pom.xml<\/code>.<\/p>\n<p>If that sounds easy, you&#8217;ll be pleased to know that it&#8217;s just as easy to get started.<\/p>\n<\/p>\n<div class=\"embedded-resource-list callout-float-right\">\n<div class=\"field field--name-title field--type-string field--label-hidden field__item\">More on Java<\/div>\n<div class=\"field field--name-links field--type-link field--label-hidden field__items\">\n<div class=\"field__item\"><a href=\"https:\/\/developers.redhat.com\/topics\/enterprise-java\/?intcmp=7013a000002Cxq6AAC\">What is enterprise Java programming?<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/developers.redhat.com\/products\/openjdk\/overview?intcmp=7013a000002Cxq6AAC\">Red Hat build of OpenJDK<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/opensource.com\/downloads\/java-cheat-sheet?intcmp=7013a000002Cxq6AAC\">Java cheat sheet<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/www.redhat.com\/en\/services\/training\/do092-developing-cloud-native-applications-microservices-architectures?intcmp=7013a000002Cxq6AAC\">Free online course: Developing cloud-native applications with microservices arc\u2026<\/a><\/div>\n<div class=\"field__item\"><a href=\"https:\/\/opensource.com\/tags\/java?intcmp=7013a000002Cxq6AAC\">Fresh Java articles<\/a><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<h2>Install Maven<\/h2>\n<p>Maven is available on most Linux distributions from your package manager.<\/p>\n<p>On Fedora, Mageia, and similar distributions:<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"bash geshifilter-bash\"><span class=\"co4\">$ <\/span><span class=\"kw2\">sudo<\/span> dnf <span class=\"kw2\">install<\/span> maven<\/code><\/span><\/pre>\n<p>On Elementary, Mint, and other Debian-based distributions:<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"bash geshifilter-bash\"><span class=\"co4\">$ <\/span><span class=\"kw2\">sudo<\/span> apt <span class=\"kw2\">install<\/span> maven<\/code><\/span><\/pre>\n<p>On macOS, use <a href=\"https:\/\/opensource.com\/article\/20\/11\/macports\">MacPorts<\/a> or <a href=\"https:\/\/opensource.com\/article\/20\/6\/homebrew-mac\">Homebrew<\/a>.<\/p>\n<p>On Windows, use <a href=\"https:\/\/opensource.com\/article\/20\/3\/chocolatey\">Chocolatey<\/a>.<\/p>\n<h2>Configuring<\/h2>\n<p>On most systems, Maven is already configured after installation.<\/p>\n<p>If you have a complex Java setup, however, with different versions installed for different projects, you may need to set your <code>JAVA_HOME<\/code> <a href=\"https:\/\/opensource.com\/article\/19\/8\/what-are-environment-variables\">environment variable<\/a>.<\/p>\n<p>If you don&#8217;t know what that is, read my article about <a href=\"https:\/\/opensource.com\/article\/22\/3\/find-java-home\">finding and setting your JAVA_HOME<\/a>.<\/p>\n<p>First, verify that Maven is installed and is using the version of Java you intend:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"bash geshifilter-bash\">$ mvn <span class=\"re5\">-version<\/span><br>\nApache Maven x.y.z<br>\nMaven home: <span class=\"sy0\">\/<\/span>usr<span class=\"sy0\">\/<\/span>share<span class=\"sy0\">\/<\/span>maven<br>\nJava version: X.Y.Z, vendor: Red Hat, Inc.,<br>\nruntime: <span class=\"sy0\">\/<\/span>usr<span class=\"sy0\">\/<\/span>lib<span class=\"sy0\">\/<\/span>jvm<span class=\"sy0\">\/<\/span>java-XX-openjdk-XX<\/div><\/div><\/pre>\n<h2>Your first POM file<\/h2>\n<p>Maven bases everything it does on a project&#8217;s POM file. You can think of <code>pom.xml<\/code> as Maven&#8217;s equivalent of <a href=\"https:\/\/opensource.com\/article\/18\/8\/what-how-makefile\">Autotool&#8217;s Makefile<\/a> or CMake&#8217;s <a href=\"https:\/\/opensource.com\/article\/21\/5\/cmake\">CMakeLists.txt<\/a> file. You put instructions that are meaningful to Maven in <code>pom.xml<\/code>, and it executes those instructions when prompted.<\/p>\n<p>A <a href=\"https:\/\/opensource.com\/article\/20\/7\/ide-java\">good IDE<\/a>, like <a href=\"https:\/\/opensource.com\/article\/19\/10\/cloud-ide-che\">Eclipse<\/a> or NetBeans, might provide a boilerplate <code>pom.xml<\/code> file when creating a Maven project.<\/p>\n<p>Depending on how comfortable you are in XML, this process might look more complex than it actually is. There&#8217;s a distinct advantage to using XML here, so have a look even if you&#8217;re not familiar with the language.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"xml geshifilter-xml\"><span class=\"sc3\"><span class=\"re1\"><?xml <\/span><span class=\"re0\">version<\/span>=<span class=\"st0\">\"1.0\"<\/span> <span class=\"re0\">encoding<\/span>=<span class=\"st0\">\"UTF-8\"<\/span><span class=\"re2\">?&gt;<\/span><\/span><br><span class=\"sc3\"><span class=\"re1\"><project><span class=\"re0\">xmlns<\/span>=<span class=\"st0\">\"http:\/\/maven.apache.org\/POM\/4.0.0\"<\/span><\/project><\/span><br><span class=\"sc3\"><span class=\"re0\">xmlns:xsi<\/span>=<span class=\"st0\">\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"<\/span><\/span><br><span class=\"sc3\"><span class=\"re0\">xsi:schemaLocation<\/span>=<span class=\"st0\">\"http:\/\/maven.apache.org\/POM\/4.0.0<\/span><br><span class=\"sc3\">http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"<\/span><span class=\"re2\">&gt;<\/span><\/span><br>\n\u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><modelversion class=\"re2\">&gt;<\/modelversion><\/span><\/span><\/span>4.0.0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><groupid class=\"re2\">&gt;<\/groupid><\/span><\/span><\/span>com.example<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><artifactid class=\"re2\">&gt;<\/artifactid><\/span><\/span>example4Maven<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><version class=\"re2\">&gt;<\/version><\/span><\/span>1.0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><packaging class=\"re2\">&gt;<\/packaging><\/span><\/span>jar<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><properties class=\"re2\">&gt;<\/properties><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><project.build.sourceencoding class=\"re2\">&gt;<\/project.build.sourceencoding><\/span><\/span>UTF-8<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><maven.compiler.source class=\"re2\">&gt;<\/maven.compiler.source><\/span><\/span>11<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><maven.compiler.target class=\"re2\">&gt;<\/maven.compiler.target><\/span><\/span>11<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br><span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><\/div><\/div><\/pre>\n<p>The first elements (<code><?xml ?><\/code> and <code><project><\/project><\/code>) contain information about the file itself, identifying the document as XML written in accordance with the Maven POM schema. The next group of elements corresponds to the Maven schema used and the project settings I provided to NetBeans.<\/p>\n<p>The <code><packaging><\/packaging><\/code> element specifies that this project is meant to be packaged as a JAR file.<\/p>\n<p>The <code><properties><\/properties><\/code> element tells Maven about the (as-yet non-existent) source code in my project. It&#8217;s written in UTF-8 encoding for OpenJDK version 11.<\/p>\n<p>All of that was autogenerated by NetBeans for me when I created an example project.<\/p>\n<p>If you don&#8217;t use an IDE that integrates with Maven, or you simply prefer to write yours from scratch, you can find the skeleton outline of a POM file at <a href=\"https:\/\/maven.apache.org\/pom.html#Quick_Overview\" target=\"blank\" rel=\"noopener\">maven.apache.org\/pom.html#Quick_Overview<\/a>. It&#8217;s clearly commented and has the XML declarations already populated.<\/p>\n<h2>Adding a dependency to your POM<\/h2>\n<p>Long ago, when you wrote a Java application and decided to use an external library, you could download a JAR of the library, save it to your codebase, then use an <code>import<\/code> statement to reference it in your Java code. It was a manual system, and while it worked as well as using, say, a C or C++ library, it could be a lot of work to maintain.<\/p>\n<p>Maven uses repositories, much like Linux uses repositories for <a href=\"https:\/\/opensource.com\/article\/21\/2\/linux-packaging\">software installation<\/a>, and Python uses <a href=\"https:\/\/opensource.com\/article\/19\/11\/python-pip-cheat-sheet\">pip<\/a>. The default repository is Sonatype&#8217;s <a href=\"https:\/\/central.sonatype.org\/\" target=\"blank\" rel=\"noopener\">Central Repository<\/a>, which you can search from <a href=\"https:\/\/search.maven.org\/\" target=\"blank\" rel=\"noopener\">search.maven.org<\/a>. From Central, you can find libraries and the appropriate metadata you need to fill in the required dependency fields for Maven. In practice, however, most Java libraries provide that information in their README files or documentation.<\/p>\n<p>Suppose you have a simple Java script that lists files in a directory, but you decide you want it to list only files ending in <code>jpg<\/code> or <code>png<\/code>. The Apache <code>fileUtils<\/code> library offers a filename filter for precisely that kind of operation, but it&#8217;s not included in the Java distribution.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\"><span class=\"kw1\">package<\/span> <span class=\"co2\">com.example.example4maven<\/span><span class=\"sy0\">;<\/span><br><br><span class=\"kw1\">import<\/span> <span class=\"co2\">java.io.File<\/span><span class=\"sy0\">;<\/span><br><span class=\"kw1\">import<\/span> <span class=\"co2\">java.util.Iterator<\/span><span class=\"sy0\">;<\/span><br><span class=\"kw1\">import<\/span> <span class=\"co2\">java.util.List<\/span><span class=\"sy0\">;<\/span><br><span class=\"co1\">\/\/ external libs<\/span><br><span class=\"kw1\">import<\/span> <span class=\"co2\">org.apache.commons.io.FileUtils<\/span><span class=\"sy0\">;<\/span><br><br><span class=\"kw1\">public<\/span> <span class=\"kw1\">class<\/span> Main <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 <span class=\"kw1\">private<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw1\">final<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+file\"><span class=\"kw3\">File<\/span><\/a> myDir <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+file\"><span class=\"kw3\">File<\/span><\/a><span class=\"br0\">(<\/span><span class=\"st0\">\"\/home\/tux\/img\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 <span class=\"kw1\">private<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw1\">final<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span> ext <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span> <span class=\"br0\">{<\/span> <span class=\"st0\">\"jpg\"<\/span>,<span class=\"st0\">\"png\"<\/span> <span class=\"br0\">}<\/span><span class=\"sy0\">;<\/span><br><br>\n\u00a0 \u00a0 <span class=\"kw1\">public<\/span> <span class=\"kw1\">static<\/span> <span class=\"kw4\">void<\/span> main<span class=\"br0\">(<\/span><a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+string\"><span class=\"kw3\">String<\/span><\/a><span class=\"br0\">[<\/span><span class=\"br0\">]<\/span> args<span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 List<span class=\"sy0\">File<span class=\"sy0\">&gt;<\/span> images <span class=\"sy0\">=<\/span> <span class=\"br0\">(<\/span>List<span class=\"sy0\">File<span class=\"sy0\">&gt;<\/span><span class=\"br0\">)<\/span> FileUtils.<span class=\"me1\">listFiles<\/span><span class=\"br0\">(<\/span>myDir, ext, <span class=\"kw2\">false<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"kw1\">for<\/span> <span class=\"br0\">(<\/span>Iterator<span class=\"sy0\">File<span class=\"sy0\">&gt;<\/span> i <span class=\"sy0\">=<\/span> images.<span class=\"me1\">iterator<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span> i.<span class=\"me1\">hasNext<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <a href=\"http:\/\/www.google.com\/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+system\"><span class=\"kw3\">System<\/span><\/a>.<span class=\"me1\">out<\/span>.<span class=\"me1\">println<\/span><span class=\"br0\">(<\/span>i.<span class=\"me1\">next<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span>.<span class=\"me1\">getName<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"br0\">}<\/span><br>\n\u00a0 \u00a0 <span class=\"br0\">}<\/span><br><span class=\"br0\">}<\/span><\/span><\/span><\/span><\/div><\/div><\/pre>\n<p>You could search Central for the library, or you can visit the project&#8217;s <a href=\"https:\/\/commons.apache.org\/proper\/commons-io\/dependency-info.html\" target=\"blank\" rel=\"noopener\">website<\/a> and get the dependency info there.<\/p>\n<p>Dependency information looks like this:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"xml geshifilter-xml\"><span class=\"sc3\"><span class=\"re1\"><dependency class=\"re2\">&gt;<\/dependency><\/span><\/span><br>\n\u00a0 <span class=\"sc3\"><span class=\"re1\"><groupid class=\"re2\">&gt;<\/groupid><\/span><\/span>commons-io<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 <span class=\"sc3\"><span class=\"re1\"><artifactid class=\"re2\">&gt;<\/artifactid><\/span><\/span>commons-io<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 <span class=\"sc3\"><span class=\"re1\"><version class=\"re2\">&gt;<\/version><\/span><\/span>2.11.0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br><span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><\/div><\/div><\/pre>\n<p>Enter that between <code><dependencies><\/dependencies><\/code> and <code><\/code> tags in your <code>pom.xml<\/code> file, and you&#8217;ve added the Apache <code>commons.io<\/code> library to your project.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\"><span class=\"sy0\"><\/span>xml version<span class=\"sy0\">=<\/span><span class=\"st0\">\"1.0\"<\/span> encoding<span class=\"sy0\">=<\/span><span class=\"st0\">\"UTF-8\"<\/span><span class=\"sy0\">?&gt;<\/span><br><span class=\"sy0\">project xmlns<span class=\"sy0\">=<\/span><span class=\"st0\">\"http:\/\/maven.apache.org\/POM\/4.0.0\"<\/span> <br>\nxmlns<span class=\"sy0\">:<\/span>xsi<span class=\"sy0\">=<\/span><span class=\"st0\">\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"<\/span> <br>\nxsi<span class=\"sy0\">:<\/span>schemaLocation<span class=\"sy0\">=<\/span><span class=\"st0\">\"http:\/\/maven.apache.org\/POM\/4.0.0 <span class=\"es0\"><\/span><br>\nhttp:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"<\/span><span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 <span class=\"sy0\">modelVersion<span class=\"sy0\">&gt;<\/span>4.0.0<span class=\"sy0\"><\/span>modelVersion<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 <span class=\"sy0\">groupId<span class=\"sy0\">&gt;<\/span>com.<span class=\"me1\">example<\/span><span class=\"sy0\"><\/span>groupId<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 <span class=\"sy0\">artifactId<span class=\"sy0\">&gt;<\/span>example4Maven<span class=\"sy0\"><\/span>artifactId<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 <span class=\"sy0\">version<span class=\"sy0\">&gt;<\/span><span class=\"nu0\">1.0<\/span><span class=\"sy0\"><\/span>version<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 <span class=\"sy0\">packaging<span class=\"sy0\">&gt;<\/span>jar<span class=\"sy0\"><\/span>packaging<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 <span class=\"sy0\">properties<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sy0\">project.<span class=\"me1\">build<\/span>.<span class=\"me1\">sourceEncoding<\/span><span class=\"sy0\">&gt;<\/span>UTF<span class=\"sy0\">-<\/span><span class=\"nu0\">8<\/span><span class=\"sy0\"><\/span>project.<span class=\"me1\">build<\/span>.<span class=\"me1\">sourceEncoding<\/span><span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sy0\">maven.<span class=\"me1\">compiler<\/span>.<span class=\"me1\">source<\/span><span class=\"sy0\">&gt;<\/span><span class=\"nu0\">11<\/span><span class=\"sy0\"><\/span>maven.<span class=\"me1\">compiler<\/span>.<span class=\"me1\">source<\/span><span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sy0\">maven.<span class=\"me1\">compiler<\/span>.<span class=\"me1\">target<\/span><span class=\"sy0\">&gt;<\/span><span class=\"nu0\">11<\/span><span class=\"sy0\"><\/span>maven.<span class=\"me1\">compiler<\/span>.<span class=\"me1\">target<\/span><span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 <span class=\"sy0\"><\/span>properties<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 <span class=\"sy0\">dependencies<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sy0\">dependency<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sy0\">groupId<span class=\"sy0\">&gt;<\/span>commons<span class=\"sy0\">-<\/span>io<span class=\"sy0\"><\/span>groupId<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sy0\">artifactId<span class=\"sy0\">&gt;<\/span>commons<span class=\"sy0\">-<\/span>io<span class=\"sy0\"><\/span>artifactId<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sy0\">version<span class=\"sy0\">&gt;<\/span>2.11.0<span class=\"sy0\"><\/span>version<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sy0\">type<span class=\"sy0\">&gt;<\/span>jar<span class=\"sy0\"><\/span>type<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 <span class=\"sy0\"><\/span>dependency<span class=\"sy0\">&gt;<\/span><br>\n\u00a0 \u00a0 <span class=\"sy0\"><\/span>dependencies<span class=\"sy0\">&gt;<\/span><br><span class=\"sy0\"><\/span>project<span class=\"sy0\">&gt;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/div><\/div><\/pre>\n<p>Now when you build your project, Maven can automatically download any libraries you don&#8217;t have in your local codebase.<\/p>\n<h2>Build a JAR with Maven<\/h2>\n<p>You can create JAR files with tools like <a href=\"https:\/\/opensource.com\/article\/21\/8\/fastjar\">fastjar or gjar<\/a>, but Maven has plugins that enable it to perform common build tasks, including packaging. For a standard JAR package, which contains your source code, you can use <code>maven-jar-plugin<\/code>.<\/p>\n<p>To have Maven create an &#8220;Uber JAR&#8221;\u00a0for you, which contains your code plus all the dependent libraries your code requires, you can use <code>maven-assembly-plugin<\/code>. The two plugins are similar in both purpose and configuration, and they&#8217;re both build plugins, so they&#8217;re entered into a <code><build><\/build><\/code> section of your <code>pom.xml<\/code>.<\/p>\n<p>As with libraries, Maven metadata for plugins is available from the plugin&#8217;s homepage. You include <code>maven-assembly-plugin<\/code> by listing its <code>groupId<\/code>, <code>artifactId<\/code>, and <code>version<\/code> between <code><plugin><\/plugin><\/code> tags.<\/p>\n<p>There are additional configuration options, including:<\/p>\n<ul>\n<li>a set of preset behaviors<\/li>\n<li>the ability to change the name of the output based on project name rather than your project&#8217;s codename<\/li>\n<li>the ability to append your own entries into <code>MANIFEST.MF<\/code>.<\/li>\n<\/ul>\n<p>This is useful when your main class isn&#8217;t called <code>Main.class<\/code>.<\/p>\n<p>To tell the plugin when it&#8217;s meant to be invoked, you must also define which keyword in your Maven build triggers it.<\/p>\n<p>For <code>maven-assembly-plugin<\/code>, you probably want it to activate when you use <code>mvn package<\/code>.<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"xml geshifilter-xml\">\u00a0 \u00a0 <span class=\"sc3\"><span class=\"re1\"><build class=\"re2\">&gt;<\/build><\/span><\/span><br>\n\u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><plugin class=\"re2\">&gt;<\/plugin><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><groupid class=\"re2\">&gt;<\/groupid><\/span><\/span>org.apache.maven.plugins<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><artifactid class=\"re2\">&gt;<\/artifactid><\/span><\/span>maven-assembly-plugin<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><version class=\"re2\">&gt;<\/version><\/span><\/span>3.3.0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><configuration class=\"re2\">&gt;<\/configuration><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><descriptorrefs class=\"re2\">&gt;<\/descriptorrefs><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><descriptorref class=\"re2\">&gt;<\/descriptorref><\/span><\/span>jar-with-dependencies<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><finalname class=\"re2\">&gt;<\/finalname><\/span><\/span>Lister-${project.version}<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><appendassemblyid class=\"re2\">&gt;<\/appendassemblyid><\/span><\/span>false<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><archive class=\"re2\">&gt;<\/archive><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><manifestfile class=\"re2\">&gt;<\/manifestfile><\/span><\/span>src\/main\/resources\/META-INF\/MANIFEST.MF  <br><span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><executions class=\"re2\">&gt;<\/executions><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><execution class=\"re2\">&gt;<\/execution><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><id class=\"re2\">&gt;<\/id><\/span><\/span>make-assembly<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><phase class=\"re2\">&gt;<\/phase><\/span><\/span>package<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><goals class=\"re2\">&gt;<\/goals><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><goal class=\"re2\">&gt;<\/goal><\/span><\/span>single<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br>\n\u00a0 \u00a0<span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><br><span class=\"sc3\"><span class=\"re1\"><span class=\"re2\">&gt;<\/span><\/span><\/span><\/div><\/div><\/pre>\n<p>Test your build:<\/p>\n<pre>\n<span class=\"geshifilter\"><code class=\"bash geshifilter-bash\"><span class=\"co4\">$ <\/span>mvn clean package<\/code><\/span><\/pre>\n<p>After your project builds, you can find your Uber JAR in the autogenerated <code>targets<\/code> directory:<\/p>\n<pre>\n<div class=\"geshifilter\"><div class=\"java geshifilter-java\">$ java <span class=\"sy0\">-<\/span>jar targets<span class=\"sy0\">\/<\/span>Lister<span class=\"sy0\">-<\/span><span class=\"nu0\">1.0<\/span>.<span class=\"me1\">jar<\/span><br>\nfoo.<span class=\"me1\">png<\/span><br>\nfoo.<span class=\"me1\">jpg<\/span><br>\nbar.<span class=\"me1\">jpg<\/span><br>\nbar.<span class=\"me1\">png<\/span><\/div><\/div><\/pre>\n<p>It works as expected.<\/p>\n<h2>Build with Maven<\/h2>\n<p>Maven makes managing your Java project easy and resilient. With Maven, contributors can bootstrap their environment quickly, getting all the libraries they need, and create predictable builds for their users. Its XML configuration keeps syntax simple and lintable, and it makes adding new options easy.<\/p>\n<p>Try Maven with your next Java project and see what you think.<\/p>\n<\/div>\n<div class=\"clearfix text-formatted field field--name-field-article-subhead field--type-text-long field--label-hidden field__item\">\n<p>Focus on solving problems while this open source tool keeps track of your Java libraries.<\/p>\n<\/div>\n<div class=\"field field--name-field-lead-image field--type-entity-reference field--label-hidden field__item\">\n<article class=\"media media--type-image media--view-mode-caption\">\n<div class=\"field field--name-field-media-image field--type-image field--label-hidden field__item\">  <img decoding=\"async\" src=\"https:\/\/www.cryptocabaret.com\/wp-content\/uploads\/2022\/03\/java-coffee-mug-1.jpg\" width=\"520\" height=\"292\" alt=\"What is your favorite open source Java IDE?\" title=\"What is your favorite open source Java IDE?\" loading=\"lazy\"><\/div>\n<div class=\"field field--name-field-caption field--type-text-long field--label-hidden caption field__item\"><span class=\"caption__byline\">Image by: <\/span><\/p>\n<p>Pixabay. CC0.<\/p>\n<\/div>\n<\/article>\n<\/div>\n<div class=\"field field--name-field-tags field--type-entity-reference field--label-hidden field__items\">\n<div class=\"field__item\"><a href=\"https:\/\/opensource.com\/tags\/java\" hreflang=\"en\">Java<\/a><\/div>\n<\/p><\/div>\n<div class=\"hidden field field--name-field-listicle-title field--type-string field--label-hidden field__item\">What to read next<\/div>\n<div class=\"field field--name-field-default-license field--type-list-string field--label-hidden field__item\"><a rel=\"license\" href=\"http:\/\/creativecommons.org\/licenses\/by-sa\/4.0\/\"><br \/>\n        <img decoding=\"async\" alt=\"Creative Commons License\" src=\"https:\/\/www.cryptocabaret.com\/wp-content\/uploads\/2022\/03\/cc-by-sa-4-1.png\" title=\"This work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.\"><\/a>This work is licensed under a Creative Commons Attribution-Share Alike 4.0 International License.<\/div>\n<section class=\"field field--name-field-comments field--type-comment field--label-hidden comment-wrapper\">\n<div class=\"comments__count\">\n<div class=\"login\"><a href=\"https:\/\/opensource.com\/user\/register?absolute=1\">Register<\/a> or <a href=\"https:\/\/opensource.com\/user\/login?current=\/rss.xml&amp;absolute=1\">Login<\/a> to post a comment.<\/div>\n<\/p><\/div>\n<\/section>\n<p class=\"wpematico_credit\"><small>Powered by <a href=\"http:\/\/www.wpematico.com\" target=\"_blank\" rel=\"noopener\">WPeMatico<\/a><\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Use Maven to manage your Java dependencies Seth Kenlon Thu, 03\/17\/2022 &#8211; 03:00 Up Register or Login to like. As an open source enthusiast, I&#8217;ve used dozens (hundreds?) of libraries that are well beyond my skill or interest as a programmer. For a lot of people, including me, the available libraries are one of the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":62988,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[307],"tags":[],"class_list":["post-62987","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-open-source"],"_links":{"self":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/posts\/62987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=62987"}],"version-history":[{"count":0,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/posts\/62987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=\/wp\/v2\/media\/62988"}],"wp:attachment":[{"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=62987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=62987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cryptocabaret.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=62987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}