<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jerome Angibaud</title>
    <description>The latest articles on Forem by Jerome Angibaud (@djeang).</description>
    <link>https://forem.com/djeang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1010991%2F704c566b-13f0-4b73-8ddb-949660178d60.jpeg</url>
      <title>Forem: Jerome Angibaud</title>
      <link>https://forem.com/djeang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/djeang"/>
    <language>en</language>
    <item>
      <title>JeKa: Run Java Sources as Fast as Native</title>
      <dc:creator>Jerome Angibaud</dc:creator>
      <pubDate>Mon, 06 Jan 2025 11:30:08 +0000</pubDate>
      <link>https://forem.com/djeang/jeka-the-simplest-way-to-start-with-java-for-real-3254</link>
      <guid>https://forem.com/djeang/jeka-the-simplest-way-to-start-with-java-for-real-3254</guid>
      <description>&lt;h2&gt;
  
  
  JeKa — A Simple Modern Java Build Tool
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://jeka.dev" rel="noopener noreferrer"&gt;JeKa&lt;/a&gt; is a modern Java build tool focused on simplicity.&lt;/p&gt;

&lt;p&gt;When starting with Java, developers usually just write some code, compile it, and run it. However, this is not enough to create useful Java applications or libraries that others can reuse. To build something practical in Java, we need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use third-party libraries (e.g., Guava, Gson, Commons CLI, etc.)&lt;/li&gt;
&lt;li&gt;Package and deploy the application/library so others can use it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is often done with traditional build tools like &lt;em&gt;Maven&lt;/em&gt; or &lt;em&gt;Gradle&lt;/em&gt;. These tools require significant learning and can involve tedious configuration.&lt;br&gt;
A simpler alternative is &lt;a href="https://jbang.dev" rel="noopener noreferrer"&gt;JBang&lt;/a&gt;, which lets you write almost single-file Java apps and easily share them.&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;a href="https://jek.dev" rel="noopener noreferrer"&gt;Jeka&lt;/a&gt; offers simple dependency management and deployment ala &lt;em&gt;JBang&lt;/em&gt; while allowing you to build standard multi-class applications or libraries with proper tests included.&lt;/p&gt;
&lt;h2&gt;
  
  
  🏗️ Scaffold a New Code Base
&lt;/h2&gt;

&lt;p&gt;JeKa can operate in both &lt;em&gt;base&lt;/em&gt; and &lt;em&gt;project&lt;/em&gt; modes. The &lt;em&gt;base&lt;/em&gt; mode uses a simpler structure, where the entire codebase resides in a single folder and dependencies are declared directly within Java classes using annotations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; To list &lt;em&gt;base&lt;/em&gt; available options, execute: &lt;code&gt;jeka base: --doc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To create a base structure, ready for starting coding right away, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jeka base: scaffold scaffold.kind&lt;span class="o"&gt;=&lt;/span&gt;APP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll get the following codebase layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;. 
├── jeka-src             &amp;lt;- Source root directory
│   ├── _dev             &amp;lt;- Optional package containing all non-prod (build and test)
│   │   ├── test
│   │   └── Custom.java  
│   └── app              &amp;lt;- Suggested base package for production code/resources
│       └── App.java     
├── jeka-output          &amp;lt;- Generated dir where artefacts as jars, classes, reports or doc are generated
├── jeka.properties      &amp;lt;- Build configuration  (Java and jeka version, kbean configurations, ...)
└── README.md            &amp;lt;- Describes available build commands
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All your Java code should be located in the jeka-src folder.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;_dev&lt;/code&gt; package is a special directory for source code and dependencies used exclusively for development purposes (e.g., tests, builds). If you're new to Java, you can ignore or delete it.&lt;/p&gt;

&lt;p&gt;The scaffolded example includes an App class within the app package. You are free to add or modify classes in any package as you see fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔄 Sync with IntelliJ
&lt;/h2&gt;

&lt;p&gt;To synchronize with IntelliJ, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jeka intellij: &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📦 Add Dependencies
&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;App.java&lt;/em&gt; class uses the &lt;code&gt;@JkDep&lt;/code&gt; annotation to reference a library. You can add as many libraries as needed. It’s a good practice to declare all dependencies in the same base class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@JkDep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.github.lalyos:jfiglet:0.0.9"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@JkDep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.fasterxml.jackson:jackson-bom:2.18.2@pom"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@JkDep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.fasterxml.jackson.core:jackson-core"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@JkDep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.fasterxml.jackson.core:jackson-annotations"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See &lt;a href="//../reference/api-dependency-management.md#string-notation"&gt;details on dependency notations&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, you can simply copy and paste JAR files into the following directory, and they will automatically be included as dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── jeka-boot      &amp;lt;- Jars included in the production classpath.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Declare non-prod dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you declare the &lt;code&gt;@JkDev&lt;/code&gt; annotation within the &lt;code&gt;_dev&lt;/code&gt; package, any dependencies it references will be excluded from the final production build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;_dev&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@JkDep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.junit:junit-bom:5.12.2@pom"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@JkDep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.junit.platform:junit-platform-launcher"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@JkDep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.junit.jupiter:junit-jupiter"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@JkDep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.mockito:mockito-junit-jupiter:5.15.2"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Custom&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;KBean&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🏃‍♂️ Run your Application
&lt;/h2&gt;

&lt;p&gt;The application can be run using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jeka &lt;span class="nt"&gt;--program&lt;/span&gt; arg0 args1 ... &lt;span class="c"&gt;# or `jeka -p` for short&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To clean the compilation before starting, use the &lt;code&gt;--clean&lt;/code&gt; &lt;em&gt;or &lt;code&gt;-c&lt;/code&gt;&lt;/em&gt; option. &lt;code&gt;-p&lt;/code&gt; stands for &lt;code&gt;--program&lt;/code&gt; shorthand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jeka &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; arg0 args1 ... &lt;span class="c"&gt;# or `jeka -p` for short&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📚 Create a Library
&lt;/h2&gt;

&lt;p&gt;If you want to write a library, instead of an application, you need to declare both &lt;em&gt;moduleId&lt;/em&gt; and versioning in order to publish it on a &lt;em&gt;Maven&lt;/em&gt; repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@base.moduleId=org.example:my-lib
@base.version=1.0.0-SNAPSHOT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can publish your library by executing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jeka maven: publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧪 Test your Code
&lt;/h2&gt;

&lt;p&gt;The scaffolded code already contains a &lt;code&gt;_dev.test.MyTest&lt;/code&gt; test class, ready to run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;. 
├── jeka-src           
│   ├── _dev             
│   │   └── test
│   │       └── MyTest.java

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can add more tests in any package you like. However, keep in mind that test classes not located in the &lt;code&gt;_dev&lt;/code&gt; package (or its sub-packages) will be included in the production JAR as dead code.&lt;/p&gt;

&lt;h2&gt;
  
  
  ☕ Change Java Version
&lt;/h2&gt;

&lt;p&gt;Nowadays, Java evolves rapidly, with new releases every six months. JeKa provides a very convenient way to switch between Java versions. Simply specify the desired version in the  &lt;em&gt;jeka.properties&lt;/em&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;jeka.java.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will automatically install JDK 24 during the next application compile or run.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 Distribute Worldwide — No Packaging Needed
&lt;/h2&gt;

&lt;p&gt;With &lt;strong&gt;JeKa&lt;/strong&gt;, you don’t need to package your project into binaries or upload it to a hosting service. Just push your code to GitHub (or any Git repository), and it’s instantly runnable by anyone, anywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Push your project to GitHub or any accessible Git repository.&lt;/li&gt;
&lt;li&gt;Anyone can run it with a single command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jeka &lt;span class="nt"&gt;-r&lt;/span&gt; https://github.com/jeka-dev/demo-cowsay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also run a specific version and pass arguments to the application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jeka &lt;span class="nt"&gt;-r&lt;/span&gt; https://github.com/jeka-dev/demo-cowsay#0.0.2 &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Hello JeKa"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;#0.0.2&lt;/em&gt; refers to the Git tag 0.0.2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Hello JeKa" is passed as an argument to the application&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ With JeKa, your Java project becomes globally accessible—no build artifacts, no deployment steps, no hassle.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧱 Move to &lt;em&gt;Project&lt;/em&gt; Mode
&lt;/h2&gt;

&lt;p&gt;As the codebase is growing, you'll might find more confortable in using a full project structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── src                  
│   ├── main             &amp;lt;- Java code and reources
│   │   ├── java
│   │   └── resources    
│   └── test             &amp;lt;- Java code and reources for tests
│       ├── java
│       └── resources 
├── jeka-src             &amp;lt;- Optional Java (or Kotlin) code for building the project
│   └── Custom.java      
├── jeka-output          &amp;lt;- Generated dir where artifacts as jars, classes, reports or doc are generated
├── dependencies.txt     &amp;lt;- Dependency lists for compile, runtime and testing
├── jeka.properties      &amp;lt;- Build configuration  (Java and jeka version, kben configurations, ...)
├── jeka.ps              &amp;lt;- Optional Powershell script to boot Jeka on Windows
├── jeka                 &amp;lt;- Optional bash script to boot Jeka on Linuw/MacOS
└── README.md            &amp;lt;- Describes available build commands for building the project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Moving to project is easy, to figure out how to do, visit the &lt;a href="https://jeka-dev.github.io/jeka/tutorials/build-projects/" rel="noopener noreferrer"&gt;Build Projects Tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔷 Code with Kotlin
&lt;/h2&gt;

&lt;p&gt;You can also write &lt;em&gt;Kotlin&lt;/em&gt; code in your codebase. Just specify the Kotlin version you want to use in the &lt;code&gt;jeka.properties&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;jeka.kotlin.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2.1.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can edit &lt;em&gt;Kotlin&lt;/em&gt; code as shown below, seamlessly integrate it with the existing Java code in your codebase, or even create a 100% Kotlin application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Greeting&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠️ Pre-defined Build Commands
&lt;/h2&gt;

&lt;p&gt;Among others, Jeka provides the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jeka base: test       # Runs tests
jeka base: pack       # Runs tests + creates jars
jeka base: runJar     # Runs the jar generated by the above command
jeka base: info       # Displays project configuration info
jeka base: depTree    # Displays dependency trees 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jeka native: compile     # Compiles to native executable

jeka docker: build       # Builds a Docker image for the project
jeka docker: info        # Displays info about generated image.
jeka docker: buildNative # Builds a Docker image containing the native executable
jeka docker: infoNative  # Displays info about generated native image 

jeka maven: publishLocal # Publish artifacts in the local repository
jeka maven: publish      # Publish in the defined Maven repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🏁 Conclusion
&lt;/h2&gt;

&lt;p&gt;Jeka offers a practical mode to start writing real-life Java application without the burden of traditional build tools.&lt;/p&gt;

&lt;p&gt;Its polymorphic structure allows handling increasing complexity and size gradually, without sacrificing simplicity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jeka.dev" rel="noopener noreferrer"&gt;Jeka&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jeka-dev/demo-base-application" rel="noopener noreferrer"&gt;Simple app Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jeka-dev/working-examples/tree/master/springboot-base" rel="noopener noreferrer"&gt;Spring-Boot app Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jeka-dev.github.io/jeka/tutorials/build-base" rel="noopener noreferrer"&gt;Build Base Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jeka-dev.github.io/jeka/examples/" rel="noopener noreferrer"&gt;Other Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>maven</category>
      <category>jbang</category>
      <category>programming</category>
    </item>
    <item>
      <title>JeKa: The Simplest Way to Create Uber and Shade Jars</title>
      <dc:creator>Jerome Angibaud</dc:creator>
      <pubDate>Thu, 02 Jan 2025 14:14:40 +0000</pubDate>
      <link>https://forem.com/djeang/jeka-the-simplest-way-to-create-uber-and-shade-jars-2c0f</link>
      <guid>https://forem.com/djeang/jeka-the-simplest-way-to-create-uber-and-shade-jars-2c0f</guid>
      <description>&lt;p&gt;&lt;strong&gt;Edited 2025-10-15:&lt;/strong&gt; Fix the Maven pom.xml sample.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jeka.dev" rel="noopener noreferrer"&gt;JeKa&lt;/a&gt; is a modern Java build tool focused on simplicity.  &lt;/p&gt;

&lt;p&gt;This post is part of the &lt;em&gt;"Jeka: the simplest way to..."&lt;/em&gt; series and shows how to create a fat jar (shaded or not) effortlessly.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Applications : Simple Fat Jar
&lt;/h3&gt;

&lt;p&gt;A common way to package Java applications is by creating &lt;em&gt;FAT&lt;/em&gt; jars. A fat jar bundles all classes from the dependencies, so you only need the jar (along with the Java Runtime) to run the application.&lt;/p&gt;

&lt;p&gt;Your application may need dependencies, which you can list in the &lt;em&gt;dependencies.txt&lt;/em&gt; file as shown in the example below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ada"&gt;&lt;code&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lalyos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;jfiglet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;
&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guava&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;guava&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;33.4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;jre&lt;/span&gt;
&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fasterxml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jackson&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;jackson&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2.18&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;junit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jupiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;junit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;jupiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;5.8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To configure the fat jar generation, edit the &lt;em&gt;jeka.properties&lt;/em&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;jeka.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0.11.37&lt;/span&gt;
&lt;span class="py"&gt;jeka.java.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;17&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;project.pack.detectMainClass&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;project.pack.jarType&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;FAT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;@project.pack.jarType&lt;/code&gt; property specifies the type of JAR to generate. It can be &lt;code&gt;REGULAR&lt;/code&gt;, &lt;code&gt;FAT&lt;/code&gt;, or &lt;code&gt;SHADE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;@project.pack.detectMainClass=true&lt;/code&gt; setting instructs Jeka to detect the &lt;code&gt;main&lt;/code&gt; class to include in the manifest file.&lt;/p&gt;

&lt;p&gt;To generate the jar, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jeka project: pack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The FAT jar will be created in the &lt;em&gt;jeka-output&lt;/em&gt; directory. To run it, just execute: &lt;code&gt;java -jar [jar-name].jar&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Libraries : Shade Fat jar
&lt;/h3&gt;

&lt;p&gt;For libraries, an established practice consists in keeping a regular Jar and providing a Fat Jar as an additional option.&lt;/p&gt;

&lt;p&gt;In some situation, such as a version clash, dependency classes should be relocated to a specific package to avoid classpath conflicts for the consumers. We call a &lt;em&gt;shade&lt;/em&gt; jar, a &lt;em&gt;fat&lt;/em&gt; jar where the dependencies classes have been re-located in a specific package.&lt;/p&gt;

&lt;p&gt;To create such a jar, configure JeKa as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;jeka.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0.11.37&lt;/span&gt;
&lt;span class="py"&gt;jeka.java.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;17&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;project.moduleId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;org.examples:my-lib&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;project.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1.0.0-SNAPSHOT&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;project.pack.shadeJarClassifier&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;maven.publication.extraArtifacts&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, invoking &lt;code&gt;jeka prpject: pack&lt;/code&gt; will also create a &lt;em&gt;org.examples.my-lib-all.jar&lt;/em&gt; file.&lt;br&gt;
By opening this jar file, we can see that all dependency classes has been automatically relocated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── org                  
│   └── example             
│       └── mylib           &amp;lt;- Base package for my-lib classes
│           ├── MyLyb.class   
│           └── _shaded     &amp;lt;- Base package for dependency classes
│               ├── com.google...
│               ├── com.fasterxml.jackson...
│               └── com.github.lalyos.jfiglat...
└── META-INF             
    └── MANIFEST.MF      

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additionally, adding &lt;code&gt;@maven.publication.extraArtifacts=all&lt;/code&gt; to &lt;em&gt;jeka.properties&lt;/em&gt;, includes the shaded JAR in the &lt;em&gt;Maven&lt;/em&gt; publication generated by the &lt;code&gt;jeka maven: publish&lt;/code&gt; command.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maven Comparison
&lt;/h3&gt;

&lt;p&gt;As demonstrated below, &lt;em&gt;Maven&lt;/em&gt; requires significantly more typing to achieve a similar goal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;project&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0"&lt;/span&gt; &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt; &lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span class="nt"&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.examples&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;my-lib&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.1.0-SNAPSHOT&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.lalyos&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jfiglet&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.0.9&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.google.guava&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;guava&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;33.2.1-jre&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fasterxml.jackson.core&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-core&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.17.2&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-shade-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.6.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;minimizeJar&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/minimizeJar&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;artifactSet&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;includes&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;include&amp;gt;&lt;/span&gt;com.google.guava:guava&lt;span class="nt"&gt;&amp;lt;/include&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;include&amp;gt;&lt;/span&gt;com.github.lalyos:jfiglet&lt;span class="nt"&gt;&amp;lt;/include&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;include&amp;gt;&lt;/span&gt;com.fasterxml.jackson.core:jackson-core&lt;span class="nt"&gt;&amp;lt;/include&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;/includes&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;/artifactSet&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;relocations&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;relocation&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;pattern&amp;gt;&lt;/span&gt;com.google.common&lt;span class="nt"&gt;&amp;lt;/pattern&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;shadedPattern&amp;gt;&lt;/span&gt;org.elasticsearch.common&lt;span class="nt"&gt;&amp;lt;/shadedPattern&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;/relocation&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;relocation&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;pattern&amp;gt;&lt;/span&gt;com.fasterxml.jackson&lt;span class="nt"&gt;&amp;lt;/pattern&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;shadedPattern&amp;gt;&lt;/span&gt;org.elasticsearch.common.jackson&lt;span class="nt"&gt;&amp;lt;/shadedPattern&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;/relocation&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;/relocations&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;filters&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;filter&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;artifact&amp;gt;&lt;/span&gt;*:*&lt;span class="nt"&gt;&amp;lt;/artifact&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;excludes&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;exclude&amp;gt;&lt;/span&gt;META-INF/license/**&lt;span class="nt"&gt;&amp;lt;/exclude&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;exclude&amp;gt;&lt;/span&gt;META-INF/*&lt;span class="nt"&gt;&amp;lt;/exclude&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;exclude&amp;gt;&lt;/span&gt;META-INF/maven/**&lt;span class="nt"&gt;&amp;lt;/exclude&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;exclude&amp;gt;&lt;/span&gt;LICENSE&lt;span class="nt"&gt;&amp;lt;/exclude&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;exclude&amp;gt;&lt;/span&gt;NOTICE&lt;span class="nt"&gt;&amp;lt;/exclude&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;exclude&amp;gt;&lt;/span&gt;/*.txt&lt;span class="nt"&gt;&amp;lt;/exclude&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;exclude&amp;gt;&lt;/span&gt;build.properties&lt;span class="nt"&gt;&amp;lt;/exclude&amp;gt;&lt;/span&gt;
                     &lt;span class="nt"&gt;&amp;lt;/excludes&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;/filter&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;/filters&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Jeka makes building Java projects significantly easier, with minimal configuration compared to &lt;em&gt;Maven&lt;/em&gt; or &lt;em&gt;Gradle&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Explore &lt;a href="https://jeka-dev.github.io/jeka/examples/" rel="noopener noreferrer"&gt;more examples&lt;/a&gt; to discover how Jeka can adapt to your project’s needs!&lt;/p&gt;

</description>
      <category>java</category>
      <category>gradle</category>
      <category>maven</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>JeKa: The Simplest Way to Publish on Maven Central</title>
      <dc:creator>Jerome Angibaud</dc:creator>
      <pubDate>Mon, 30 Dec 2024 10:48:43 +0000</pubDate>
      <link>https://forem.com/djeang/jeka-the-simplest-way-to-publish-on-maven-central-f14</link>
      <guid>https://forem.com/djeang/jeka-the-simplest-way-to-publish-on-maven-central-f14</guid>
      <description>&lt;p&gt;Update: This article now reference the new way for publishing, via &lt;a href="https://central.sonatype.com" rel="noopener noreferrer"&gt;Central Portal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jeka.dev" rel="noopener noreferrer"&gt;JeKa&lt;/a&gt; is a modern Java build tool focused on simplicity.&lt;br&gt;
This post demonstrates how to publish to Maven Central with minimal configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisite:&lt;/strong&gt; You need a &lt;a href="https://central.sonatype.com" rel="noopener noreferrer"&gt;Central Portal Account&lt;/a&gt;to publish on Maven Central.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configure and Run
&lt;/h3&gt;

&lt;p&gt;With JeKa, you can fully configure the build by editing the &lt;em&gt;jeka.properties&lt;/em&gt; file as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;jeka.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0.11.37&lt;/span&gt;
&lt;span class="py"&gt;jeka.java.version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;17&lt;/span&gt;

&lt;span class="py"&gt;jeka.classpath&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dev.jeka:centralprotal-plugin&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;project.moduleId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;com.github.djeang:vincer-dom&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;project.gitVersioning.enable&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# Metadata required by Maven Central for publishing
&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;maven.pub.metadata.projectName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Vincer-Dom&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;maven.pub.metadata.projectDescription&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Modern Dom manipulation library for Java&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;maven.pub.metadata.projectUrl&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://github.com/djeang/vincer-dom&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;maven.pub.metadata.projectScmUrl&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;https://github.com/djeang/vincer-dom.git&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;maven.pub.metadata.licenses&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Apache License V2.0:https://www.apache.org/licenses/LICENSE-2.0.html&lt;/span&gt;
&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;maven.publication.metadata.developers&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;djeang:djeangdev@yahoo.fr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that dependencies are listed in a dedicated &lt;em&gt;dependencies.txt&lt;/em&gt; file to maintain clear separation of concerns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[version]&lt;/span&gt;
&lt;span class="err"&gt;org.junit:junit-bom:5.12.2@pom&lt;/span&gt;

&lt;span class="nn"&gt;[compile]&lt;/span&gt;

&lt;span class="nn"&gt;[test]&lt;/span&gt;
&lt;span class="err"&gt;org.junit.platform:junit-platform-launcher&lt;/span&gt;
&lt;span class="err"&gt;org.junit.jupiter:junit-jupiter&lt;/span&gt;
&lt;span class="err"&gt;org.jdom:jdom2:2.0.6.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To publish to Maven Central, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jeka project: pack centralportal: publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See a concrete example &lt;a href="https://github.com/djeang/vincer-dom" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub action
&lt;/h3&gt;

&lt;p&gt;The following &lt;em&gt;Github Action&lt;/em&gt; workflow builds the project and publish to &lt;em&gt;Maven Central&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git fetch --prune --unshallow --tags&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and publish&lt;/span&gt;
      &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;JEKA_CENTRAL_PORTAL_USERNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.CENTRAL_PORTAL_USERNAME }}&lt;/span&gt;
        &lt;span class="na"&gt;JEKA_CENTRAL_PORTAL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.CENTRAL_PORTAL_PASSWORD }}&lt;/span&gt;
        &lt;span class="na"&gt;JEKA_CENTRAL_PORTAL_SIGN_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GPG_SECRET_KEY}}&lt;/span&gt;
        &lt;span class="na"&gt;JEKA_CENTRAL_PORTAL_SIGN_KEY_PASSPHRASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GPG_PASSPHRASE }}&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./jeka&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;centralportal:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;publish"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks to its powerful &lt;em&gt;wrapper&lt;/em&gt;, Jeka will install specified JDK and Jeka version by itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explanations
&lt;/h3&gt;

&lt;p&gt;Now that you know how to do it, let's explain how it works.&lt;/p&gt;

&lt;h4&gt;
  
  
  Jeka and Java Versioning
&lt;/h4&gt;

&lt;p&gt;For better portability and reproducibility, we can declare both the Jeka and Java versions required for building. Both versions will be automatically downloaded if not already present on the host machine.&lt;/p&gt;

&lt;h4&gt;
  
  
  Specify Module ID and Versioning
&lt;/h4&gt;

&lt;p&gt;The published &lt;code&gt;moduleId&lt;/code&gt; is specified using the &lt;code&gt;@project.moduleId&lt;/code&gt; property.&lt;br&gt;&lt;br&gt;
The version can be explicitly specified using the &lt;code&gt;@project.version&lt;/code&gt; property. Note that properties can be set in the &lt;em&gt;jeka.properties&lt;/em&gt; file or passed as a command-line argument: &lt;code&gt;-D@project.version=1.0.1&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Instead, we choose to rely on Git to infer the version using: &lt;code&gt;@project.gitVersioning.enable=true&lt;/code&gt;. If there is no tag on the current commit, the version will be set to &lt;em&gt;[branch]-SNAPSHOT&lt;/em&gt;; otherwise, it will be the &lt;em&gt;tag-name&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  Provide secrets
&lt;/h4&gt;

&lt;p&gt;To publish on &lt;em&gt;Maven Central&lt;/em&gt;, we need to signs artefact files with the appropriate GPG key mentioned in &lt;em&gt;Central Portal&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We also need to specify credentials at publication time.&lt;/p&gt;

&lt;p&gt;For those, Jeka expects these values to be found in the followinng environment variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;JEKA_CENTRAL_PORTAL_USERNAME&lt;/code&gt;: OSSRH account username&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;JEKA_CENTRAL_PORTAL_PASSWORD&lt;/code&gt;: OSSRH account password&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;JEKA_CENTRAL_PORTAL_SIGN_KEY&lt;/code&gt;: Armored GPG secret key as a string&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;JEKA_CENTRAL_PORTAL_SIGN_KEY_PASSPHRASE&lt;/code&gt;: The passphrase protecting the secret key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The content of &lt;code&gt;JEKA_CENTRAL_PORTAL_SIGN_KEY&lt;/code&gt; can be obtained by executing: &lt;code&gt;gpg --export-secret-key --armor MY-KEY&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  Provide Publication Metadata
&lt;/h4&gt;

&lt;p&gt;The mandatory metadata are set using &lt;code&gt;@maven.pub.metadata.xxx&lt;/code&gt; properties.&lt;br&gt;&lt;br&gt;
Note that the &lt;code&gt;@maven.pub.metadata.licenses&lt;/code&gt; property expects a format like: &lt;em&gt;[license1 name]:[license1 url],[license2 name]:[license2 url],...&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Automate Release Publication
&lt;/h4&gt;

&lt;p&gt;By default, the published artefacts are automatically published to &lt;em&gt;Maven Central&lt;/em&gt;. If you want to just validate your publication an publish to &lt;em&gt;Maven Central&lt;/em&gt; manually (from &lt;em&gt;Central Portal&lt;/em&gt; UI), you need to specify this configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="py"&gt;centralportal.automatic&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execute Build
&lt;/h3&gt;

&lt;p&gt;To publish, simply execute: &lt;code&gt;jeka project: pack centralportal: publish&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create the JAR to publish (&lt;code&gt;project: pack&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Create source and Javadoc JARs.&lt;/li&gt;
&lt;li&gt;Generate the published POM file.&lt;/li&gt;
&lt;li&gt;Compute all checksums.&lt;/li&gt;
&lt;li&gt;Sign all published files.&lt;/li&gt;
&lt;li&gt;Push everything to the &lt;em&gt;Central Portal&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To see what will be published, execute: &lt;code&gt;jeka maven: info&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Find more details &lt;a href="https://github.com/jeka-dev/jeka/tree/master/plugins/plugins.centralportal" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparison with Maven
&lt;/h3&gt;

&lt;p&gt;The following is the Maven POM configuration equivalent for deploying a project to Maven Central:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;
&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;project&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0"&lt;/span&gt;
         &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;
         &lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span class="nt"&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;developers&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;developer&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;djeang&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;email&amp;gt;&lt;/span&gt;djeangdev@yahoo.fr&lt;span class="nt"&gt;&amp;lt;/email&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/developer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/developers&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Vincer-DOM&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;Modern Dom manipulation library for Java.&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://github.com/djeang/vincer-dom&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.djeang&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;vincer-dom&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.1.0-SNAPSHOT&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;licenses&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;license&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;MIT License&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;http://www.opensource.org/licenses/mit-license.php&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/license&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/licenses&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;java.version&amp;gt;&lt;/span&gt;17&lt;span class="nt"&gt;&amp;lt;/java.version&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;maven-compiler-plugin.version&amp;gt;&lt;/span&gt;3.11.0&lt;span class="nt"&gt;&amp;lt;/maven-compiler-plugin.version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;scm&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;connection&amp;gt;&lt;/span&gt;scm:git:git://github.com/djeang/vincer-dom.git&lt;span class="nt"&gt;&amp;lt;/connection&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;developerConnection&amp;gt;&lt;/span&gt;scm:git:https://github.com/djeang/vincer-dom.git&lt;span class="nt"&gt;&amp;lt;/developerConnection&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://github.com/djeang/vincer-domr&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/scm&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;distributionManagement&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;snapshotRepository&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;ossrh&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://s01.oss.sonatype.org/content/repositories/snapshots&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/snapshotRepository&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;ossrh&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/&lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/distributionManagement&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;dependencyManagement&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.junit&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;junit-bom&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;5.9.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;type&amp;gt;&lt;/span&gt;pom&lt;span class="nt"&gt;&amp;lt;/type&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;import&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dependencyManagement&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;org.junit.jupiter&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;junit-jupiter&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;org.junit.platform&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;junit-platform-launcher&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
             &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;org.jdom&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
             &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jdom2&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.0.6.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;pluginManagement&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-compiler-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${maven-compiler-plugin.version}&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;source&amp;gt;&lt;/span&gt;${java.version}&lt;span class="nt"&gt;&amp;lt;/source&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;target&amp;gt;&lt;/span&gt;${java.version}&lt;span class="nt"&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-source-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.2.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;attach-sources&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;jar-no-fork&lt;span class="nt"&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-javadoc-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.9.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;attach-javadocs&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;jar&lt;span class="nt"&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-gpg-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.5&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
                          &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;sign-artifacts&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                          &lt;span class="nt"&gt;&amp;lt;phase&amp;gt;&lt;/span&gt;verify&lt;span class="nt"&gt;&amp;lt;/phase&amp;gt;&lt;/span&gt;
                          &lt;span class="nt"&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                              &lt;span class="nt"&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;sign&lt;span class="nt"&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
                          &lt;span class="nt"&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.sonatype.central&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;central-publishing-maven-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.4.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;extensions&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/extensions&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                         &lt;span class="nt"&gt;&amp;lt;publishingServerId&amp;gt;&lt;/span&gt;central&lt;span class="nt"&gt;&amp;lt;/publishingServerId&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;tokenAuth&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/tokenAuth&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/pluginManagement&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-compiler-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;me.ccampo&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;git-version-maven-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.1.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt; 
                &lt;span class="nt"&gt;&amp;lt;extensions&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/extensions&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;strategy&lt;/span&gt; &lt;span class="na"&gt;hint=&lt;/span&gt;&lt;span class="s"&gt;"git"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Jeka provides a simpler, yet powerful way to build Java software and publish artifacts to Maven Central or other repositories, with much less configuration and effort than traditional tools.&lt;/p&gt;

&lt;p&gt;Visit the &lt;a href="https://jeka.dev" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://jeka.dev/#seeinaction" rel="noopener noreferrer"&gt;videos&lt;/a&gt;, and &lt;a href="https://jeka-dev.github.io/jeka/examples/" rel="noopener noreferrer"&gt;examples&lt;/a&gt; to get an idea of everything Jeka can do better.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer:&lt;/em&gt; I am the author of Jeka.&lt;/p&gt;

</description>
      <category>java</category>
      <category>devops</category>
      <category>gradle</category>
      <category>maven</category>
    </item>
  </channel>
</rss>
