Support alternative markup for Apache Maven POM files
Java Scala Kotlin Clojure Groovy Ruby
Clone or download
Tradunsky and mosabua Polyglot kotlin (#170)
* Made PoC of kotlin pom

* added DSL example of curly branches ad mapping

* Implemented first base version of kom

* Made groupId and version inheritable form parent

* Added relativePath support as well as fully qualified parent definition with braces

* Made first e2e integration of a regular project kom

* Dependencies:
 - Add dependency scopes: runtime, system
 - Add GAV definition of artifact
 - Rename params for better name hints in intellij idea
 - Decouple Dependency convertation from KomConverter

 NOTE: assertk for better test reading

* Add dependency type

* Add full support of maven dependency details

* Adds build section, plugins+executions

NOTE:
 - changed scope "this" to its section
 - added DslMarker to define scope and reduce methods cal invariants

* Plugin configuration free style

Free style definition:
 - String with braces is a name of section/element and section scope.
 - String with square brackets is a plural name of sections per value.
 - String withing plus assign value is element name and value
 - String withing "sameAs" value is element name and value
 - String withing leaded by plus is single/empty element

NOTE:
 - plugin gav
 - plugin inheritance disabling

* Plugin dependencies

* Dependency details infix functions

* Multi-module project

* Dependency management

* Plugin management

* First level Build fields

* Project details and propertries writer

* project dependencies writer

* project build details writer

* Writes dependency details

* Writes plugins

* Writes plugin configuration

* Writes multi-project modules

* Renames property assigning method

* Profiles: Adds profiles with activation and build sections

NOTE: makes parent optional

* Adds profile dependencies

* Adds profiles dependencyManagement

* Add README.md

* Move samples of kom into polyglot-maven-examples
Latest commit e439264 Jul 18, 2018
Permalink
Failed to load latest commit information.
.mvn/wrapper adding download file Jul 2, 2018
polyglot-atom [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-clojure [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-common [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-groovy [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-java [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-kotlin Polyglot kotlin (#170) Jul 18, 2018
polyglot-maven-plugin [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-ruby [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-scala [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-translate-plugin [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-xml [maven-release-plugin] prepare for next development iteration Jun 27, 2018
polyglot-yaml [maven-release-plugin] prepare for next development iteration Jun 27, 2018
poms Add Scala POM to the examples Oct 5, 2013
.gitignore cleanup gitignore Mar 18, 2015
.looper.yml simplified looper config May 23, 2017
CHANGELOG.md added changelog section for next version Jun 27, 2018
LICENSE.txt adding license file with EPL Sep 6, 2017
README.md added link to slack Jun 27, 2018
license-header.txt Update license date to prepare for first release Mar 18, 2015
mvnw updated to latest maven wrapper Jul 2, 2018
mvnw.cmd updated to latest maven wrapper Jul 2, 2018
pom.xml Polyglot kotlin (#170) Jul 18, 2018

README.md

Overview

Polyglot for Maven is a set of extensions for Maven 3.3.1+ that allows the POM model to be written in dialects other than XML. Several of the dialects also allow inlined plugins: the Ruby, Groovy and Scala dialects allow this.

License

Maven Central

Gitter chat

Takari Slack

Here's an example POM written in the Ruby dialect:

project 'Polyglot :: Aggregator' do

  model_version '4.0.0'
  id 'io.tesla.polyglot:tesla-polyglot:0.0.1-SNAPSHOT'
  inherit 'io.tesla:tesla:4'
  packaging 'pom'

  properties( 'sisuInjectVersion' => '0.0.0.M2a',
              'teslaVersion' => '3.1.0' )

  modules [ 'tesla-polyglot-common',
            'tesla-polyglot-atom',
            'tesla-polyglot-ruby',
            'tesla-polyglot-groovy',
            'tesla-polyglot-yaml',
            'tesla-polyglot-clojure',
            'tesla-polyglot-scala',
            'tesla-polyglot-java',
            'tesla-polyglot-xml',
            'tesla-polyglot-cli',
            'tesla-polyglot-maven-plugin' ]

  overrides do
    jar 'org.eclipse.sisu:org.eclipse.sisu.inject:${sisuInjectVersion}'
    jar 'org.eclipse.sisu:org.eclipse.sisu.plexus:${sisuInjectVersion}'
    jar 'org.apache.maven:maven-model-builder:3.1.0'
    jar 'org.apache.maven:maven-embedder:3.1.0'
    jar( 'junit:junit:4.11', :scope => 'test' )

  end

  plugin 'org.codehaus.plexus:plexus-component-metadata:1.5.4' do
    execute_goals 'generate-metadata', 'generate-test-metadata'
  end

  build do
    execute("first", :validate) do |context|
      puts "Hello from JRuby!"
    end
  end
end

Requirements

Usage

To use Polyglot for Maven you need to edit ${maven.multiModuleProjectDirectory}/.mvn/extensions.xml and add the appropriate language extension.

The scala dialect supports a separate configuration parameter polyglot.scala.outputdir to specify a different output directory. This avoids the deletion during a Maven clean phase run, when set to a different folder such as .polyglot-cache instead of the default target. Inspect polyglot-maven-examples/scala/.mvn/maven.config for an example setup.

Available Languages

The available languages, in alphabetical order, with their artifact id are:

Language Artifact Id
Atom polyglot-atom
Groovy polyglot-groovy
Clojure polyglot-clojure
Ruby polyglot-ruby
Scala polyglot-scala
YAML polyglot-yaml
Java polyglot-java
XML polyglot-xml

The groupId value is io.takari.polyglot.

Update extensions.xml

Edit the extensions.xml file and add the following, replacing ARTIFACTID with the artifactId for your chosen language.

<?xml version="1.0" encoding="UTF-8"?>
<extensions>
  <extension>
    <groupId>io.takari.polyglot</groupId>
    <artifactId>ARTIFACTID</artifactId>
    <version>0.3.0</version>
  </extension>
</extensions>

Convert existing POM

We have created a simple Maven plugin that will help you convert any existing pom.xml files:

mvn io.takari.polyglot:polyglot-translate-plugin:translate \
  -Dinput=pom.xml -Doutput=pom.{format}

Where the supported formats are rb, groovy, scala, yaml, atom, java and of course xml. See here for more info. You can even convert back to xml or cross-convert between all supported formats.

Known Limitations and Issues

Interoperability

The whole interoperability story has not been worked out but you can create a XML-formatted POM from the Polyglot version. Currently mixing different dialects within a reactor is not supported.

A pom.xml will currently not be installed or deployed except for the Ruby DSL and the Scala DSL but we are working towards this feature for all DSLs.

Tooling

Some support in IDE's like IntelliJ IDEA and Eclipse exist and the different markup languages are understood by various syntax highlighters. However, full integration of the markup syntax and the specific Maven-related aspects is not available.

Limited Plugin Support

Maven plugins or Maven plugin goals that rely on the XML format are not supported, since they are either attempting to parse the XML directly or modify it in automated fashion do not work with Polyglot Maven. Examples are:

  • Maven Relase Plugin
  • Maven Versions Plugin (goals that don't edit the pom.xml (like e.g. display-dependency-updates) work as expected though)

Fixes would have to be implemented in these plugins. Workarounds or replacement workflows for most usecases exist.

Polyglot Maven in Real Life

Despite the warning above, Polyglot Maven is pretty stable right now. Have a look at the integration tests for each dialect in this repository for some examples as well as our dedicated polyglot-maven-examples project.

The following projects are real world usage examples that use Polyglot Maven in their regular development and release work:

Ruby

YAML

  • http://snakeyaml.org - Extensive usage of Polyglot YAML and contributions to the project from the team.

  • https://urbanise.com - Using Polyglot YAML for building next generation strata management platform.

Scala

Java Projects

  • LambdaTest - A simple Java project with a standalone pom.scala

  • CmdOption - A Java project with a top-level reactor project and an additional shared scala file included into both pom.scalas

Scala Projects

  • Domino - A simple project using Polyglot Scala.

  • Blended - A complex multi-project using Polyglot Scala. It's also an example where the #include feature is heavily used to share common configuration but avoid Maven parent poms, which are often problematic.

Please let us know of your usage by filing an issue so we can add it here.