damit das auch mal wieder gesagt ist: so zu arbeiten wäre der Traum.
Aber eben - die Realität ist: unverlinkbare Word-Dokumente, Excel - etc…
Jazz Platform
Dieses Blog ist in erster Linie ein öffentliches Notizbuch für mich selber: ich notiere darin kleine Dinge, die ich immer wieder vergesse. Oder Entwicklungen, die ich spannend finde.
Dienstag, 27. November 2012
Mittwoch, 21. November 2012
Erwartete Exception in JUnit
Wieder ein Klassiker, den ich jedesmal vergesse, wenn ich ihn brauche - drum hier im Blog.
Ich erwarte in JUnit einen Exception, und möchte auch die Message der Exception testen.
Hier ist die Lösung:
Möchte man die Message nicht anschauen, erwartete bloss, dass es knallt, genügt dies:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Rule | |
public ExpectedException dupliziertesTargetJUnitRule = ExpectedException.none(); | |
@Test | |
public void duplikateException(){ | |
dupliziertesTargetJUnitRule.expect(PolicyException.class); | |
dupliziertesTargetJUnitRule.expectMessage("PolicyDuplikat1"); | |
dupliziertesTargetJUnitRule.expectMessage("PolicyDuplikat2"); | |
//Code, der die Exception auslöst... | |
Environment frameworktest= new Environment(); | |
brokerportal.addAttribute(EnvironmentAttributeType.APPLICATION, "frameworktest"); | |
SARERequest request = new SARERequest(arbeiter, Action.MUTATE, vertrag, frameworktest); | |
Decision entscheid = RPDP.doerDaeDaDaa(request); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Test(expected=PolicyException.class) | |
public void duplikateException(){ | |
//Code, der die Exception auslöst... | |
Environment frameworktest= new Environment(); | |
brokerportal.addAttribute(EnvironmentAttributeType.APPLICATION, "frameworktest"); | |
SARERequest request = new SARERequest(arbeiter, Action.MUTATE, vertrag, frameworktest); | |
Decision entscheid = RPDP.doerDaeDaDaa(request); | |
} |
Donnerstag, 15. November 2012
Reflections
Um Klassen zur Laufzeit zu laden, habe ich grad folgendes kleines, sehr mächtiges Framework entdeckt:
http://code.google.com/p/reflections/
Damit lässt sich sehr einfach eine einfache Plug-In Architektur erstellen, um - in diesem Fall - zur Laufzeit Policies zu laden, die eine Policy-Klasse erweitert.
Bemerkung: wie zu erwarten war, funktioniert das natürlich - wie immer in solchen Fällen - unter JBoss nicht, wegen Klassenlader-Problemen. Wir suchen die Lösung noch...
http://code.google.com/p/reflections/
Damit lässt sich sehr einfach eine einfache Plug-In Architektur erstellen, um - in diesem Fall - zur Laufzeit Policies zu laden, die eine Policy-Klasse erweitert.
Bemerkung: wie zu erwarten war, funktioniert das natürlich - wie immer in solchen Fällen - unter JBoss nicht, wegen Klassenlader-Problemen. Wir suchen die Lösung noch...
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package ch.schumm.security.pdp; | |
import java.lang.annotation.Retention; | |
import java.lang.annotation.RetentionPolicy; | |
/** | |
* Policies mit dieser Annotation werden vom PolicyDispatcher nicht geladen und damit auch nicht ausgewertet. | |
* @author C709360 | |
* | |
*/ | |
@Retention(RetentionPolicy.RUNTIME) | |
public @interface IgnorePolicy { | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package ch.schumm.security.pdp; | |
import java.lang.annotation.Annotation; | |
import java.util.ArrayList; | |
import java.util.List; | |
import java.util.Set; | |
import org.reflections.Reflections; | |
import ch.schumm.security.policy.Policy; | |
public class ReflectionPolicyFinder { | |
/** | |
* Findet alle Policies im Packet ch.schumm.security.policy - ausser Policies mit der {@link IgnorePolicy} | |
* Annotation, z.B. die Default-Policy. | |
* @return | |
*/ | |
public static List<Policy> scanForPolicies() { | |
Reflections reflections = new Reflections("ch.schumm.security.policy"); | |
Set<Class<? extends Policy>> policyTypes = reflections.getSubTypesOf(Policy.class); | |
ArrayList<Policy> policiesReturn = new ArrayList<Policy>(); | |
for (Class<? extends Policy> policyType : policyTypes) { | |
// if (policyType != DefaultPolicy.class) { | |
if (!policyHasIgnoreAnnotation(policyType)) { | |
try { | |
Policy policy = policyType.newInstance(); | |
policiesReturn.add(policy); | |
System.out.println(policy); | |
} catch (InstantiationException e) { | |
throw new PolicFinderException(e); | |
} catch (IllegalAccessException e) { | |
throw new PolicFinderException(e); | |
} | |
} | |
} | |
return policiesReturn; | |
} | |
private static boolean policyHasIgnoreAnnotation(Class<? extends Policy> policyType) { | |
boolean hasIgnoreAnotation = false; | |
Annotation[] declaredAnnotations = policyType.getDeclaredAnnotations(); | |
for (Annotation annotation : declaredAnnotations) { | |
if (annotation.annotationType() == IgnorePolicy.class) { | |
hasIgnoreAnotation = true; | |
} | |
} | |
return hasIgnoreAnotation; | |
} | |
public static void main(String[] args) { | |
scanForPolicies(); | |
} | |
} |
Samstag, 10. November 2012
Warum Java?!? Ich mach doch nichts. Der Facebook-Updater.
Ich habe mein "Mountain Lion" frisch installiert, noch ohne Java (neuerdings hat ein frischer Mac noch kein Java...) - und beim jeden einloggen kommt die Meldung:
Was ist das?!? Ich habe nichts mit Java gestartet. Läuft da irgendein Zeugs, das ich nicht will?!?
Ein Blick in die Console verrät mir:
Nov 10 20:48:34 oscar.local Download Java Components[3256]: Java Install cancelled
Und, eine Prozess-ID tiefer, ein Klick früher, der Übeltäter:
Nov 10 20:48:26 oscar com.apple.launchd.peruser.501[141] (com.facebook.videochat.rschumm.updater[3255]): Exited with code: 1
Facebook? Wtf...
Es stellt sich heraus, dass facebook-Video-Chat, eine Abklatsch-Version von Skype, stinkfrech einen LaunchAgent installiert, der immer wieder (und auch beim Einloggen) den Befehl
java -cp /Users/rschumm/Library/Application Support/Facebook/video/1.2.0.158/FacebookUpdate.jar
laufenlässt. Gopf :-)
Getriggert wird das durch
/Users/rschumm/Library/LaunchAgents/com.facebook.videochat.rschumm.plist
Wenn ich die Datei lösche, ist der Spuk vorbei. Und ich habe was über LaunchAgents gelernt.
Weitere Infos:
Wenn das alle so machen würden wie Facebook.... dann könnte man noch lange warten mit Einloggen.
Mittwoch, 7. November 2012
TimeMachine: neue HD
Mac OS X ist schon cool…
Ich habe soeben eine neue Harddisk in mein gutes altes MacBook Pro unter «Mac OS X Mountain Lion» eingebaut. Mit dem Migrations-Assi alles von der alten HD importiert. Dauert stundenlang, aber klappt. (Man könnte das auch von TimeMachine machen.)
Nun kommt aber die grosse Frage: neue Harddisk, neue UUID der Harddisk - peilt das TimeMachine oder macht es ein volle Backup und verliert die History?
Die Antwort im system.log:
cool… First backup after disk inheritance - die History geht also nicht verloren.
Ich habe soeben eine neue Harddisk in mein gutes altes MacBook Pro unter «Mac OS X Mountain Lion» eingebaut. Mit dem Migrations-Assi alles von der alten HD importiert. Dauert stundenlang, aber klappt. (Man könnte das auch von TimeMachine machen.)
Nun kommt aber die grosse Frage: neue Harddisk, neue UUID der Harddisk - peilt das TimeMachine oder macht es ein volle Backup und verliert die History?
Die Antwort im system.log:
Nov 7 18:56:21 oscar.local com.apple.backupd[419]: Backing up to: /Volumes/Time Machine-Backups/Backups.backupdb
Nov 7 18:56:24 oscar.local com.apple.backupd[419]: Inherited root volume Macintosh HD, UUID: BFEA6DB7-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
Nov 7 18:56:25 oscar.local com.apple.backupd[419]: Event store UUIDs don't match for volume: Macintosh HD
Nov 7 18:56:34 oscar.local com.apple.backupd[419]: Deep event scan at path:/ reason:must scan subdirs|new event db|
Nov 7 18:56:34 oscar.local com.apple.backupd[419]: First backup after disk inheritance for / - complete scan required
Nov 7 18:56:34 oscar.local SystemUIServer[180]: Warning: accessing obsolete X509Anchors.
cool… First backup after disk inheritance - die History geht also nicht verloren.
mvn release: update Versions
Um mit dem Maven Release Plug-In Versionsnummer anzupassen, ohne den ganzen anderen Karsumpel zu machen:
http://maven.apache.org/plugins/maven-release-plugin/examples/update-versions.html
mvn release:update-versions -DautoVersionSubmodules=trueDetails:
http://maven.apache.org/plugins/maven-release-plugin/examples/update-versions.html
Freitag, 2. November 2012
Java aus xsd: JAXB
Etwas kleines, nicht neues, einfaches, aber extrem cooles:
Man hat ein Schema, z.B. das von XACML3,
http://docs.oasis-open.org/xacml/3.0/xacml-core-v3-schema-wd-17.xsd
und möchte davon mit Java eine Instanz abfüllen.
Nichts einfacher als das mit JAXB:
Man stelle das Schema in /src/main/xsd und lasse einen mvn install laufen, mit folgendem Plugin konfiguriert:
Man hat ein Schema, z.B. das von XACML3,
http://docs.oasis-open.org/xacml/3.0/xacml-core-v3-schema-wd-17.xsd
und möchte davon mit Java eine Instanz abfüllen.
Nichts einfacher als das mit JAXB:
Man stelle das Schema in /src/main/xsd und lasse einen mvn install laufen, mit folgendem Plugin konfiguriert:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<plugin> | |
<groupId>org.codehaus.mojo</groupId> | |
<artifactId>jaxb2-maven-plugin</artifactId> | |
<version>1.5</version> | |
<executions> | |
<execution> | |
<id>xjc</id> | |
<goals> | |
<goal>xjc</goal> | |
</goals> | |
</execution> | |
</executions> | |
</plugin> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.StringReader; | |
import java.io.StringWriter; | |
import javax.xml.bind.JAXB; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.DecisionType; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.RequestType; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ResponseType; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ResultType; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.StatusType; | |
public class XacmlMarshallUtil { | |
public static Result extractResultFromXacmlResponseString(String xacmlResponseAsString) { | |
StringReader reader = new StringReader(xacmlResponseAsString); | |
ResponseType responseType = JAXB.unmarshal(reader, ResponseType.class); | |
ResultType resultType = responseType.getResult().get(0); | |
DecisionType decision = resultType.getDecision(); | |
StatusType status = resultType.getStatus(); | |
Result result = mapToOurResult(decision, status); | |
return result; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.axa.ch.authorization.client.pep.facade; | |
import static org.junit.Assert.assertEquals; | |
import java.io.IOException; | |
import org.junit.Test; | |
import org.xml.sax.SAXException; | |
import junit.framework.Assert; | |
public class XacmlMarshallUtilTest { | |
@Test | |
public void testExtractResultFromXacmlResponseString() { | |
Result result = XacmlMarshallUtil.extractResultFromXacmlResponseString(createResponse()); | |
assertEquals(Result.Decision.Deny, result.getDecision()); | |
} | |
private String createResponse() { | |
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?> " | |
+ "<Response xmlns=\"urn:oasis:names:tc:xacml:3.0:core:schema:wd-17\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:oasis:names:tc:xacml:3.0:core:schema:wd-17 http://docs.oasis-open.org/xacml/3.0/xacml-core-v3-schema-wd-17.xsd\">" | |
+ "<Result><Decision>Deny</Decision></Result></Response>"; | |
} | |
} |
Die generierten Klassen landen in target und werden von eclipse automatisch in den build-path genommen. Fertig.
Die Klassen können dann ganz einfach benützt werden: hier wird z.B. ein XACML-String von JAXB geparst und in Java umgewandelt:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.StringReader; | |
import java.io.StringWriter; | |
import javax.xml.bind.JAXB; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.DecisionType; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.RequestType; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ResponseType; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.ResultType; | |
import oasis.names.tc.xacml._3_0.core.schema.wd_17.StatusType; | |
public class XacmlMarshallUtil { | |
public static Result extractResultFromXacmlResponseString(String xacmlResponseAsString) { | |
StringReader reader = new StringReader(xacmlResponseAsString); | |
ResponseType responseType = JAXB.unmarshal(reader, ResponseType.class); | |
ResultType resultType = responseType.getResult().get(0); | |
DecisionType decision = resultType.getDecision(); | |
StatusType status = resultType.getStatus(); | |
Result result = mapToOurResult(decision, status); | |
return result; | |
} |
Proxy...
Die Arbeits-Bremse in jedem Unternehmensnetzwerk: Proxy. Jedesmal muss ich nachschauen, darum hier:
System.setProperty("http.proxyHost", "myProxyServer.com");
System.setProperty("http.proxyPort", "80");
bzw:
-Dhttp.proxyHost=10.0.0.100 -Dhttp.proxyPort=8800
Dienstag, 16. Oktober 2012
Links zum Arbeitsfluss mit Git
kleine Präsentation:
http://prezi.com/i4lvgkre3sj6/git/
Interessanter Artikel über den Arbeitsfluss mit Git:
A successful Git branching model
http://prezi.com/i4lvgkre3sj6/git/
Arbeitsfluss
A successful Git branching model
Arbeitsfluss II - Atlassian
GitFlow Workflows:
Die Sache mit den Branches
Bester Artikel:
Literatur
ProGit, das Standartwerk:
Guter Vortrag über die Internals von git:
Freitag, 12. Oktober 2012
Fix apache/PHP auf Mountain Lion
Donnerstag, 27. September 2012
CVS und so...
Ja, peinlich, aber wir setzten immer noch CVS ein. Der Tenor: «Warum ändern, wir können alles mit CVS machen…»
Eben nicht :-(
Was genau passiert, ist unklar: auf jeden Fall ist das Arbeiten fast unmöglich. Bei jedem Sync. meldet Eclipse outgoint changes oder conflicts von Dingen, die man gar nicht angerührt hat. Oder 1000x mal «the file is out of sync with the filesystem».
Wer hat sonst noch diese Probleme? Liegt’s an CVS (wohl eher nicht). An Eclipse? An der hierarchischen Projektstruktur, wo alle Projekte doppelt vorkommen?
Ich wollte nun grad nachschauen, ob Netbeans auch so Probleme hat wie Eclipse und, grosse Überraschung: Netbeans unterstütz gar kein CVS mehr :-) Ausser man installiert es nach.
Hmm, vielleicht sollte man CVS wirklich aufgeben und git einführen...
"Ok", denke ich, "installiere ich halt das CVS-Plug-In". Aber eben, denkste... natürlich geht auch das nicht, der Proxy verhindert den Zugriff auf die Update-Site... fail.. fail...
Eben nicht :-(
Die Fehler
Was genau passiert, ist unklar: auf jeden Fall ist das Arbeiten fast unmöglich. Bei jedem Sync. meldet Eclipse outgoint changes oder conflicts von Dingen, die man gar nicht angerührt hat. Oder 1000x mal «the file is out of sync with the filesystem».
Wer hat sonst noch diese Probleme? Liegt’s an CVS (wohl eher nicht). An Eclipse? An der hierarchischen Projektstruktur, wo alle Projekte doppelt vorkommen?
![]() |
typische CVS-Fehlermeldung, wenn ich lokal gar nichts geändert habe. |
Netbeans
Ich wollte nun grad nachschauen, ob Netbeans auch so Probleme hat wie Eclipse und, grosse Überraschung: Netbeans unterstütz gar kein CVS mehr :-) Ausser man installiert es nach.
Hmm, vielleicht sollte man CVS wirklich aufgeben und git einführen...
"Ok", denke ich, "installiere ich halt das CVS-Plug-In". Aber eben, denkste... natürlich geht auch das nicht, der Proxy verhindert den Zugriff auf die Update-Site... fail.. fail...
Dienstag, 28. August 2012
Die Sache mit «WhatsApp»
Seit einigen Tagen bin ich nicht mehr mit WhatsApp erreichbar. WhatsApp war für mich nicht benutzbar, weil ich der App nicht erlaubt habe, auf mein Adressebuch zuzugreifen. Eine - vielleicht - etwas paranoide Erklärung dazu:
Unterdessen ist es eingeschränkt möglich, WhatsApp ohne Freischaltung des privaten Adressbuchs zu benutzen. Meine Freunde wissen davon.
- WhatsApp überträgt - ohne das explizit klar zu stellen - alle Telefonnummern aus dem Adressebuch des iPhones an ihre Server. Allerdings ohne Namen. Aber alle. Auch die meines Arztes, meines Bankberater etc. etc.
Technisch begründen tun sie das, dass sie damit «abgleichen können, wer alles WhatsApp hat, um die Favoritenliste zu erstellen». Dieses Verhalten wurde mir von einem WhatsApp Support-Mitarbeiter mitgeteilt. (Wenigsten waren sie so ehrlich und haben es nach 3x Nachfragen zugegeben.)
Nun meine Überlegungen: ist das nötig? Ich bin der Meinung: nein.
- Anstatt die Nummern zu übertragen, könnten WhatsApp Hash-Werte der normalisierten Nummern sammeln, um die gleiche Funktionnalität zu erreichen. Crypto-Experten, korrigiert mich.
- WhatsApp könnte gleich funktionieren wie iMessage oder SMS - wenn der Empfänger die App nicht hat, kommt halt eine Fehlermeldung, weil nicht zustellbar. Dann müsste WhatsApp nur meine Telefonnummer kennen - nicht alle.
Auch andere Applikationen sammeln Adressbuchdaten, z.B. facebook, iCloud, etc. etc. - aber sie tun das nicht, ohne den User zu fragen. Und sie funktionieren auch, wenn der User seine Telefonnummern nicht alle verschicken will.
Update August 2016:
Es ist passiert, was passieren musste: Facebook, der Inhaber von WhatsApp, ändert die Benutzungsrichtlinien. Telefonnummern werden mit Facebook ausgetauscht. Also wird mein privates Telefonbuch nun der US-Amerikanischen Firma Facebook bekanntgegeben, als Preis dafür, WhatsApp benutzen zu dürfen. Das geht für mich gar nicht.Unterdessen ist es eingeschränkt möglich, WhatsApp ohne Freischaltung des privaten Adressbuchs zu benutzen. Meine Freunde wissen davon.
Kleines politisches Statement dazu:
Das PTT Monopol der Bürger ist schlecht! Wir müssen die Kommunikation der Privatwirtschaft überlassen! 😳😴🙊😜 (Das sagten die Bürgerlichen Anfangs 90er Jahre...)Update Juni 2017
Ein Deutsches Gericht entscheidet, dass genau die Praxis des "Verschenkens" des persönlichen Adressebuchs als Voraussetzung zur Benutzung von WhatsApp gegen Deutsches Recht verstösst. Sozusagen die gleiche Argumentation, die auch ich mache. Spannend.
https://www.mactechnews.de/news/article/Gerichtsurteil-Nutzung-von-WhatsApp-verstoesst-gegen-geltendes-Recht-167305.html
Wieder ein kleines politisches Statement:
Aber die Marktmacht ist zu gross. Wir haben die Kontrolle über unsere Kommunikation und über unsere Freundschaftskreise an eine US-amerikanische Firma verloren.
Montag, 13. August 2012
Data-Driven Documents
Cool! Manipulation von (DOM) Dokumenten basierend auf (JSON) Daten; hightech-Algorithmen…
http://d3js.org/
…das sieht wirklich hammer spannend aus. Dann mit einer Verbindung über json zu
http://neo4j.org
und perfekt ist…
Müsste ich in einer schwachen Minute wirklich mal ausprobieren.
http://d3js.org/
…das sieht wirklich hammer spannend aus. Dann mit einer Verbindung über json zu
http://neo4j.org
und perfekt ist…
Müsste ich in einer schwachen Minute wirklich mal ausprobieren.
Dienstag, 3. Juli 2012
Kurzanleitung für das Maven-Release-Plug-In
Pom:
Folgende Dinge sind im POM relevant:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>bla.bestpracticegroupId>
<artifactId>fakeServiceartifactId>
<version>0.0.9-SNAPSHOTversion>
<packaging>jarpackaging>
<name>fakename>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<scm>
<connection>scm:cvs:pserver:@epcvs:/data/cvs_business_frameworks:bestpractices/fakeBeanconnection>
scm>
<distributionManagement>
<repository>
<id>bla-releasesid>
<url>http://mavenrepo.ch.bla.com:12697/nexus/content/repositories/bla-releasesurl>
repository>
distributionManagement>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.10version>
<scope>testscope>
dependency>
<dependency>
<groupId>commons-codecgroupId>
<artifactId>commons-codecartifactId>
<version>1.6version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-release-pluginartifactId>
<version>2.3.2version>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-source-pluginartifactId>
<version>2.1.2version>
<executions>
<execution>
<id>attach-sourcesid>
<phase>verifyphase>
<goals>
<goal>jar-no-forkgoal>
goals>
execution>
executions>
plugin>
plugins>
build>
project>
Nexus-Zugang:
In der Datei C:\Users\bla\.m2\settings.xml
muss folgendes eingetragen werden, damit das distribution-Management läuft.
<?xml version="1.0"
encoding="ISO-8859-1"?>DOCTYPE settings PUBLIC "-//APACHE//DTD
Documentation V1.3//EN" "document-v13.dtd">
<settings>
<servers>
<server>
<id>bla-releasesid>
<username>bla-integratorusername>
<password>xxxxxxxxxxxxxxxpassword>
server>
servers>
…
Run-as-Maven Launcher:
Prepare Dry testet, ob alles so läuft, wie es sollte:
release:prepare -DdryRun
Clean löscht alle generierten Artefakte:
Das Goal heisst
entsprechend: release:clean
Release schliesslich ist die "scharfe" Version, die den Release auch
wirklich macht:
mit -DreleaseVersion=1.0.0 kann man die releaste Version setzen.
mit -DreleaseVersion=1.0.0 kann man die releaste Version setzen.
Unter Parameter
Name/Value werden die CVS credentials eingetragen.
Das Passwort kann nach
den ersten Durchlauf wieder gelöscht werden, da es im File ~/.cvspass abgelegt
wird.
Ob der release
funktioniert hat, kann an folgenden drei Dingen überprüft werden:
-
Das pom
hat eine neue –SNAPSHOT Version
-
In der
CVS-History des pom taucht ein neuer Tag für diese Version auf.
-
Und
natürlich, in Hudson ist das neue Artefakt verfügbar.
Abonnieren
Posts (Atom)