• Stars
    star
    160
  • Rank 226,418 (Top 5 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created about 8 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

maven plugin to automate GoSDK load and build of projects

mvn-golang

License Apache 2.0 Java 8.0+ Maven central Maven 3.0.3+ PayPal donation YooMoney donation

Changelog

2.3.10 (08-jun-2022)

  • updated dependencies
  • default GoSDK version is 1.19

2.3.9 (04-jul-2021)

  • fix for clean fail for multi-module project if some artifacts unresolvable #90
  • fix for seldom error "Can't create temp folder" when building modules concurrently #88
  • default GoSDK version is 1.16.5
  • added autodetect for aarch64 #87

full changelog

GO start!

Taste Go in just two commands!

mvn archetype:generate -B -DarchetypeGroupId=com.igormaznitsa -DarchetypeArtifactId=mvn-golang-hello -DarchetypeVersion=2.3.10 -DgroupId=com.go.test -DartifactId=gohello -Dversion=1.0-SNAPSHOT
mvn -f ./gohello/pom.xml package

The First command in th snippet above generates a maven project with some test files and the second command builds the project. Also you can take a look at the example Hello world project using the plugin

If you want to generate a multi-module project, then you can use such snippet

mvn archetype:generate -B -DarchetypeGroupId=com.igormaznitsa -DarchetypeArtifactId=mvn-golang-hello-multi -DarchetypeVersion=2.3.10 -DgroupId=com.go.test -DartifactId=gohello-multi -Dversion=1.0-SNAPSHOT

Introduction

The Plug-in just wraps Golang tool-chain and allows to use strong maven based infrastructure to build Golang projects. It also can automatically download needed Golang SDK from the main server and tune needed version of packets for their branch, tag or revisions. Because a Golang project in the case is formed as just maven project, it is possible to work with it in any Java IDE which supports Maven. mvn-golang-wrapper

How it works

On start the plug-in makes below steps:

  • analyzing the current platform to generate needed distributive name (it can be defined directly through properties)
  • check that needed Golang SDK is already cached, if it is not cached then needed SDK will be loaded and unpacked from the main Golang SDK site
  • execute needed go lang tool bin/go with defined command, the source folder will be set as current folder
  • all folders of the project which are visible for maven (source folder, test folder, resource folders and test resource folders) are archived in ZIP file and the file is saved as a maven artifact into local maven repository (or remote maven repository). The generated ZIP artifact also contains information about dependencies which can be recognized by the plugin. In opposite to Java, Golang produces platform-dependent artifacts so that it doesn't make sense to share them through maven central but only resources and sources.

How to build

Because it is maven plugin, to build the plugin just use

mvn clean install -Pplugin

To save time, examples excluded from the main build process and activated through special profile

mvn clean install -Pexamples

Important note about automatic Golang SDK load

If you have some problems with certificates during Golang SDK load, then just add <disableSSLcheck>true</disableSSLcheck> into plugin configuration to ignore check of certificates (also you can use property 'mvn.golang.disable.ssl.check'). Also it allows property mvn.golang.disable.ssl.check to disable SSL certificate check during network actions.

How to add the plugin into maven project?

Below described build section for simple golang project which keeps source in src forlder and result should be placed into bin folder. Because it is golang project and mvn-golang plugin provides its own lifecycle, packaging for the project should be <packaging>mvn-golang</packaging>

<build>
    <!--Changing standard Maven project source structure to make it Go compatible-->
    <sourceDirectory>${basedir}${file.separator}src</sourceDirectory>
    <directory>${basedir}${file.separator}bin</directory>

    <plugins>
      <plugin>
        <groupId>com.igormaznitsa</groupId>
        <artifactId>mvn-golang-wrapper</artifactId>
        <version>2.3.10</version>
        <extensions>true</extensions>
        <executions>
          <execution>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <packages>
                <package>main.go</package>
              </packages>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
</build>

Work with dependencies

Dependencies from Maven repository (since 2.3.0)

Plugin supports work with maven repository and can install and load dependencies from there. Artifacts generated by the plugin saved in maven respository as zip archives and mvn-golang must be used as type.

<dependency>
  <groupId>com.igormaznitsa</groupId>
  <artifactId>mvn-go-test-lib</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <type>mvn-golang</type>
</dependency>

Plugin makes some trick in work with Maven Golang dependencies, it downloads Golang artifacts from repository and unpack them into temporary folder, then all unpacked dependencies are added to $GOPATH. You can take a look at example project which has two level dependency hierarchy. Dependency mechanism is enabled by default for all goals which need it, but it can be off with <scanDependencies>false</scanDependencies>. If there is any conflicts or errors in Golang for Go modules then you can turn off Go modules with

<env>
  <GO111MODULE>off</GO111MODULE>
</env>

Keep in mind that it is impossible use links to Github and Bitbucket libraries through <dependencies> maven mechanism, links to such dependencies should be processed by standard GET command and information about it you can find below.

Support of Module mode

Since 2.3.3 version, plug-in supports Golang module mode and allows to mix modules and work with golang maven dependencies, I have made some sample to show the possibility. By default support of module mode is turned off, but it can be turned on through <moduleMode>true</moduleMode> or property mvn.golang.module.mode.

Wrapped GET command

Plugin provides wrapper for Golang GET command and you can just define some external file contains package info through system property mvn.golang.get.packages.file, the file will be loaded and parsed and its definitions will be added into package dependencies. Format of the file is very easy. Each package described on a line in format package: <PACKAGE_NAME>[,branch: <BRANCH>][,tag: <TAG>][,revision: <REVISION>] also it supports single line comments through // and directive #include <FILE_NAME> to load packages from some external file. Also it supports interpolation of properties defined in format ${property.name} and provide access to maven, system and environment variables.
Example:

// example package file
#include "${basedir}/external/file.txt"
package:github.com/maruel/panicparse,tag:v1.0.2 // added because latest changes in panicparse is incompatible with termui
package:github.com/gizak/termui,branch:v2

This mechanism just makes work with dependencies easier and if you want to provide some specific flags and scripts to process CVS folders you have to define configuration parameters in pom.xml, packages defined in the external file and in the pom.xml will be mixed.

The Plug-in doesn't work with standard maven dependencies and they must be defined through task of the plugin, the example of easiest case of dependencies is

<execution>
   <id>default-get</id>
   <configuration>
     <packages>
       <package>github.com/gizak/termui</package>
       <package>github.com/kataras/iris</package>
     </packages>
   </configuration>
</execution>

it will be executed as bin/go get github.com/gizak/termui github.com/kataras/iris

If you want work with specific branch then use below snipet

<execution>
  <id>default-get</id>
  <configuration>
    <buildFlags>
    <flag>-u</flag>
    </buildFlags>
    <packages>
      <package>github.com/gizak/termui</package>
    </packages>
    <branch>v2</branch>
  </configuration>
</execution>

if you want to have several dependencies with different tag and branch then take a look at the snipet below

<execution>
  <id>dependency1</id>
  <goals>
    <goal>get</goal>
  </goals>
  <configuration>
    <packages>
      <package>github.com/some/framework</package>
    </packages>
    <tag>1.0.1</tag>
  </configuration>
</execution>
<execution>
  <id>dependency2</id>
  <goals>
    <goal>get</goal>
  </goals>
  <configuration>
    <packages>
      <package>github.com/some/another</package>
    </packages>
    <branch>v2</branch>
  </configuration>
</execution>

sometime GIT can produce cache errors and in the case you can try to turn on auto-fix of such errors with <autofixGitCache>true</autofixGitCache> flag.

How to save generated artifact in repository?

By default, artifact will be installed into maven repository automatically during install phase if you want to turn off artifact installation then you can use standard maven properties

<properties>
    <maven.install.skip>true</maven.install.skip>
    <maven.deploy.skip>true</maven.deploy.skip>
</properties>

or disable plugin mojo execution

<execution>
  <id>default-mvninstall</id>
  <phase>none</phase>
</execution>

Configuration

About configuration parameters, you can read at the wiki page.

Testing

The Wrapper just wraps calls to Go tool and recognize the exit code, if call of go test is non-zero then build will be failed, it doesn't make any analysing of test reports!
Sometime it is useful to use GoConvey tool for testing, in the case use snippet below to add dependency and make testing verbose

<execution>
  <id>default-get</id>
  <configuration>
    <buildFlags>
      <flag>-u</flag>
    </buildFlags>
    <packages>
      <package>github.com/smartystreets/goconvey</package>
    </packages>
  </configuration>
</execution>
<execution>
  <id>default-test</id>
  <configuration>
    <buildFlags>
      <flag>-v</flag>
    </buildFlags>
  </configuration>
</execution>                    

Some Examples

More Repositories

1

netbeans-mmd-plugin

Free mind map editor with plug-ins for both NetBeans and Intellij
Java
375
star
2

java-binary-block-parser

most comfortable and dynamic way to process binary data in Java and Android
Java
230
star
3

java-comment-preprocessor

preprocessor for computer languages with C-like comment format (C/C++/Java/Go)
HTML
159
star
4

zxpoly

a multi-CPU ZX-Spectrum 128 concept platform
Java
86
star
5

mind-map-set

Set of misc mind maps
84
star
6

j-j-jvm

JVM bytecode interpreter written in Java
Java
78
star
7

zxtap-to-wav

Converter of .TAP files (a ZX-Spectrum emulator data format) into .WAV sound files
Go
46
star
8

mvn-jlink

Maven plugin provides a way to load JDK and use its tools during project build
Java
38
star
9

jprol

Yet another Java based Prolog engine
Java
29
star
10

battleships-resurrection

Attempt to restore game-play of old demo-game Battleships written for E3 2001
Java
24
star
11

go-gwt-example

Example of GWT as frontend for Golang application
Java
16
star
12

japagoge

Simple animated PNG and GIF screen recorder
Java
16
star
13

jute

Small maven plugin allows to execute JUnit tests as separated external processes.
Java
16
star
14

jhexed

Java Hexagonal engine
Java
14
star
15

bkbin2wav

Converter of .BIN snapshots (BK-0010(01) emulator format) into WAV sound files to load through TAP
Go
13
star
16

mvn-finisher

Maven extension to call finishing tasks after session processing
Java
9
star
17

j2z80

Maven plugin to translate JVM bytecodes into Z80 commands
Java
8
star
18

ravikoodi-server

A utility that simplifies the exchange of video content and links from your computer to the KODI media server.
Java
7
star
19

uber-pom

Maven plugin to create uber-pom through merging of all pom files in hierarchy
Java
7
star
20

mvn-golang-example

Example application "Hello World" with the mvn-golang-wrapper plugin
Go
6
star
21

java-prolog-parser

Java based Edinburgh Prolog parser
Prolog
6
star
22

jep-238-jcp-example

Example of Maven project to build JEP-238 JAR with preprocessing
Java
6
star
23

AndroidPirateDice

Dice for the "Pirates" board game (the board game was developed by Vladimyr Golitsyn in 1934)
Java
6
star
24

nb-mvn-golang-plugin

Small set of project templates and base files to process Golang projects under NetBeans IDE
Java
4
star
25

char-sniffer

Maven plugin to check char codes in text files
Java
1
star
26

pdf-image-remover

GUI tool to remove selected images in PDF
Java
1
star
27

old-stuff

Misc old stuff
Java
1
star