Posts mit dem Label Nexus werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Nexus werden angezeigt. Alle Posts anzeigen

Montag, 5. Januar 2015

Erstellen eines eigenen Grade Plugins

Gradle lässt sich wie fast jeden andere System mittels Plugins erweitern. Ein Plugin ist nichts weiter als eine Jar-Datei die man am besten auf einen Nexus deployed. Über diesen Nexus wird dann das Plugin für andere Gradle-Projekte bereitgestellt. Hier ein typischer Ausschnitt aus der Datei build.gradle.

buildscript {
        repositories {
                maven { url "http://nexus.ebert-p.com:8080/content/groups/public" }
                maven { url "http://repo.gradle.org/gradle/libs-releases-local" }
        }

        dependencies {
                classpath "de.otto:lpt-gradle-plugin:0.0.3-SNAPSHOT"
        }
}


apply plugin: "lpt-gradle"

Mit repositories wird definiert wo nach den dependencies gesucht werden soll. Mit  dependencies wird die Jar-Datei beschrieben, die Code, hier ein eigenes Gradle-Plugin enthält. Mit apply wir das Gradle-Plugin auf das aktuelle Projekt angewendet. Wie Gradle von dem Plugin-Namen zur ausführbaren Klasse kommt wird unten beschrieben.

Zuerst muss das Plugin programmiert werden. Womit man diese Jar-Datei baut ist egal, es ist auch möglich ein Gradle-Plugin mit Maven zu bauen. Wenn man das Gradle Plugin mit Java entwickeln möchte, muss man seine Haupklasse von org.gradle.api.Plugin ableiten.

package com.ebertp.gradleplugin.wpt;

import org.gradle.api.Plugin;
import org.gradle.api.Project;


public final class WptTest implements Plugin<Project> {

@Override
public void apply(Project project) {
System.out.println("Hello Gradle Plugin User, this is Java.");
}


}


Als Zweites muss ein Mapping vom Plugin-Namen zur Hauptklasse definiert werden. Dafür muss eine Properties-Datei mit dem Namen des Plugins unter resources/META-INF/gradle-plugins angelegt werden.

src/
├── main
│   ├── java
│   │   └── com
│   │       └── ebertp
│   │           └── gradleplugin
│   │               └── wpt
│   │                   └── WptTest.java
│   └── resources
│       └── META-INF
│           └── gradle-plugins
│               └── lpt-gradle.properties
└── test
    ├── java

    └── resources

In dieser Properties-Datei wird das Mapping des Plugin-Names auf die Java Klasse definiert:

implementation-class=com.ebertp.gradleplugin.wpt.WptTest


Wichtig, der Plugin-Name hat nichts mit dem Namen der Jar Datei zu tun!

Jetzt muss nur noch eine Har-Datei gebaut werden und auf den Nexus hochgeladen werden.

Donnerstag, 3. April 2014

HOWTO: Releasing a new Software Version with Maven and Git.

Ausgangslage:

  • Versionsverwaltung mit Git und Feature Branches
  • Ich befinde mich auf dem Branch development 
  • Alle Fehler auch Javadoc Fehler sind beseitigt
  • Alle Änderungen commitet und gepushed
  • Java
  • Maven 3 und SNAPSHOTS
  • Nexus
Wie mache aus meiner einer aktuelle Entwicklung ein Release?
  1. mvn deploy, um die letzte Development Version als SNAPSHOT im Nexus zu veröffentlichen
  2. mvn versions:resolve-ranges, um Dependencies mit Range Angaben zu konkreten Versioen aufzulösen, sonst scheitert der Release-Vorgang
  3. mvn versions:use-latest-releases, um die Dependencies zu aktualisieren auf deren letzten Release-Stand
  4. git commit, um die Änderungen an der pom.xml in Git Repository zu übertragen
  5. git checkout master
  6. git merge development
  7. mvn release:prepare
  8. mvn release:perform
  9. git commit, um die Änderungen an der pom.xml in Git Repository zu übertragen
  10. git checkout development
  11. git merge master

Das beschreibt den kompletten Weg ein Release zu erstellen vom Development Branch und wieder zurück. Ach ja, und natürlich das Testen nicht vergessen.

Wenn etwas schief geht:

  1. Entfernen von Tags aus Git:
    1. git tag listet alle Tags auf
    2. git tag -d tagname entfernt den entsprechenden Git Tag aus dem lokalen Git Repo
    3. git push --delete origin tagname entfernt den entsprechenden Git Tag aus dem entfernten Git Repo
  2. Test im Release Prozess wirklich überspringen: mvn release:perform -Darguments="-DskipTests" 

Sonntag, 28. Oktober 2012

Grails Maven Integration

Es gibt verschieden Wege Grails in Maven zu integrieren, z.B. um den Nexus zu benutzen. Da wäre das Grails Plugin Maven Publisher (Link). Dieses ist für Grails 1.X geeignet, wird aber nicht mehr unterstützt. Damit fällt es aus. Ersetzt wurde das Grails Plugin Maven Publisher durch das Release Plugin (Link), welches für Grails 2.X verfügbar ist. Das funktioniert bei aktuellen Grails Projekten, leider wird das Passwort für den Nexus innerhalb des Projektes gespeichert (grails-app/conf/BuildConfig.groovy), das ist überhaupt nicht groovy, das ist fahrlässig. Damit fällt auch diese Lösung aus. Dritter Versuch, erstellen einer POM Datei aus Grails heraus. Das funktioniert nur leider kompiliert dann nichts mehr, unter Java 7 auf dem Mac (siehe Fehlerausgabe unten). Dies ist ein bekannter Bug (Link).

Fazit, drei Möglichkeiten, kein Treffer. Was macht eigentlich Ant?





[ERROR] Unresolveable build extension: Plugin org.grails:grails-maven-plugin:2.1.0 or one of its dependencies could not be resolved: Could not find artifact com.sun:tools:jar:1.6 at specified path /Library/Java/JavaVirtualMachines/jdk1.7.0_06.jdk/Contents/Home/jre/bundle/Classes/classes.jar @
[ERROR] Unknown packaging: grails-app @ line 8, column 16

at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:339)
at org.apache.maven.DefaultMaven.collectProjects(DefaultMaven.java:632)
at org.apache.maven.DefaultMaven.getProjectsForMavenReactor(DefaultMaven.java:581)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:233)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
[ERROR]  
[ERROR]   The project com.futuretv.userprofiledatasource:UserProfileDatasource:0.1 (/Users/mirkoebert/Documents/workspace-sts-2.9.0.RELEASE/UserProfileDatasource/pom.xml) has 2 errors
[ERROR]     Unresolveable build extension: Plugin org.grails:grails-maven-plugin:2.1.0 or one of its dependencies could not be resolved: Could not find artifact com.sun:tools:jar:1.6 at specified path /Library/Java/JavaVirtualMachines/jdk1.7.0_06.jdk/Contents/Home/jre/bundle/Classes/classes.jar -> [Help 2]
org.apache.maven.plugin.PluginResolutionException: Plugin org.grails:grails-maven-plugin:2.1.0 or one of its dependencies could not be resolved: Could not find artifact com.sun:tools:jar:1.6 at specified path /Library/Java/JavaVirtualMachines/jdk1.7.0_06.jdk/Contents/Home/jre/bundle/Classes/classes.jar
at org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolve(DefaultPluginDependenciesResolver.java:215)
at org.apache.maven.project.DefaultProjectBuildingHelper.resolveExtensionArtifacts(DefaultProjectBuildingHelper.java:377)
at org.apache.maven.project.DefaultProjectBuildingHelper.createProjectRealm(DefaultProjectBuildingHelper.java:237)

Donnerstag, 25. Oktober 2012

Nexus

Der Nexus ist ein Repostory für Java Bibliotheken und Artefakte. Es integriert sich perfekt in Maven. Es gibt neben der freien Version noch ein Professional Version. Ein Vorteil der Professional Version ist, dass man Maven Sites, also Projekt Sites und Reports die durch Maven erzeugt wurden, dort deployen kann. Zur Installation gibt es hier eine Anleitung. Wenn das TGZ zur Installation gewählt wurde ist dringend zu prüfen, ob der Eigentümer und die Gruppe richtig gesetzt sind (root). Dann noch schnell den Benutzer im File /etc/init.d/nexus auf root setzen. Schon läuft der Nexus unter: http://localhost:8081/nexus Benutzername: admin Passwort admin123 (bitte ändern). Jetzt einen Benutzer anlegen und ihm ausreichend Rechte geben. Dann noch Maven konfigurieren, folgende Einträge müssen ins POM:
<distributionManagement> 
    <snapshotRepository> 
        <id>snapshots</id> 
        <url>http://stage02:8081/nexus/content/repositories/snapshots</url> 
    </snapshotRepository> 
    <repository> 
        <id>release</id> 
        <url>http://stage02:8081/nexus/content/repositories/releases/</url> 
    </repository> 
</distributionManagement>
Danach muss noch die user.xml ergänzt werden:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
                      http://maven.apache.org/xsd/settings-1.0.0.xsd"> 
  <localRepository/> 
  <interactiveMode/> 
  <usePluginRegistry/> 
  <offline/> 
  <pluginGroups/> 
      <servers> 
            <id>release</id> 
            <username>ebm</username> 
            <password>XXX</password> 
        </server> 
        <server> 
            <id>snapshots</id> 
            <username>ebm</username> 
            <password>XXX</password> 
        </server> 
    </servers> 
  <mirrors/> 
  <proxies/> 
  <profiles/> 
  <activeProfiles/> 
</settings>
Jetzt kann man alles testen: mvn deploy