Archiv der Kategorie: Tools

SVN – Branch aktuell halten

Branch aktuell halten.

Wenn wir in einem Entwicklungsbranch arbeiten sollte regelmäßig (oft) der Trunk-Head in den Entwicklungsbranch gemerged werden. Damit sich die Zweige nicht zu weit von einander entfernen.

In unserem Fall nehmen wir immer die letzte Tag version. Also die letzte released Version des Trunks. So lange wir also in einem Entwicklungsbranch parallel zum Trunk arbeiten sollten nach einem Release alle Changes in den Entwicklungsbranch einfließen.

All changes that are going to be committed to Trunk, must be applied to all changes already committed to Trunk, before those changes are merged into Trunk.

Quelle:https://designbygravity.wordpress.com/2009/10/19/what-mother-never-told-you-about-svn-branching-and-merging/

Vorausetzung am Bsp. Entwicklungsbranch GUI

Der Entwicklungsbrunch ist ausgecheckt und upgedatet und liegt als “saubere” working copy im Eclipse Workspace.

Das heißt keine Datei hat ein Change welcher nicht eingecheckt ist. (Kein Sternchen)

Schritt-für-Schritt-Anleitung

  1. bei allen pom.xml´s die Version von 8.x.0-GUI-SNAPSHOT auf die neue Version 8.x.0 ändern (bspsw. 8.4.0-GUI-SNAPSHOT auf 8.5.0)
    Damit wir nicht soviele Mergekonflikte in den pom.xml´s bekommen die sich nur auf die Versionsnummer beziehen.
  2. nicht commiten
  3. Rechtsklick auf dem Projektordner in Eclipse -> Team -> Merge
    image2015-7-7-14-40-38
  4. In dem folgenden Screen das Diff auswählen was gemerged werden soll. Also die letzte Version wo der Trunk gemerged wurde (hier Tag 8.0.0) bis zu der Version die released wurde (Tag 8.1.0)
    Ziel ist unsere Working Copy!
    image2015-7-7-14-48-46
  5. Nun alle Konflikte manuell aufheben.
  6. nicht commiten.
  7. in allen poms die Version wieder ändern auf 8.x.0-GUI-SNAPSHOT
    image2015-7-7-14-56-12
  8. Dann einchecken und commit mit merged version 8.x.0 beschreiben.
    Nun haben wir im Branch den selben Entwicklungsstand wie die letzte release Version. Alle Änderungen aus der Trunkentwicklung sind vorhanden.
  9. Projekt (GUI) in Jenkins bauen.

Add Admob jar to local Maven Repository

I do not find the dependency declaration for googles Admob at Maven Central.
Download the jar https://developers.google.com/mobile-ads-sdk/download#downloadandroid
Install AdMob in my local m2 Repository to use the Dependency

ingoreschke$cd Downloads/GoogleAdMobAdsSdkAndroid-6.4.1/
ingoreschke$ mvn install:install-file -Dfile=GoogleAdMobAdsSdk-6.4.1.jar 
-DgroupId=com.google.ads
-DartifactId=admob 
-Dversion=6.4.1 
-Dpackaging=jar

refer it in your pom using

<dependency>
	<groupId>com.google.ads</groupId>
	<artifactId>admob</artifactId>
	<version>6.4.1</version>
</dependency>

Source:
http://stackoverflow.com/questions/12873586/how-to-download-and-install-jar-in-my-local-repo-maven

Alternativly you can create a helper POM in same directory

<?xml version="1.0" encoding="UTF-8"?>
 
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>de.ingoreschke</groupId>
    <artifactId>install-admob</artifactId>
    <version>1.0.0</version>
    <!--Helper POM for installing admob to local repo-->
    <build>
        <defaultGoal>install:install-file</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <file>GoogleAdMobAdsSdk-6.4.1.jar</file>
                    <groupId>com.google.ads</groupId>
                    <artifactId>admob</artifactId>
                    <packaging>jar</packaging>
                    <version>6.4.1</version>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

call mvn

mvn

Source:
http://www.michenux.net/android-admob-tutorial-461.html

maven android eclipse

prerequired:

  • Maven3 installed
  • Eclipse 3.7 or greater
  • maven – plugin
  • android plugin

create sturcture with maven.
Terminal:
go to Project Folder.

mvn archetype:generate | grep android
46: remote -&gt; com.googlecode.android-player-root-archetype:parent-archetype (-)
110: remote -&gt; com.vektorsoft.demux.tools:demux-android-archetype (Create Android application structure for DEMUX Framework applications)
117: remote -&gt; de.akquinet.android.archetypes:android-gcm-quickstart (Creates a skeleton for a GCM Android application)
118: remote -&gt; de.akquinet.android.archetypes:android-library-quickstart (Creates a skeleton for an Android library)
119: remote -&gt; de.akquinet.android.archetypes:android-quickstart (Creates a skeleton for an Android application)
120: remote -&gt; de.akquinet.android.archetypes:android-release (Creates a skeleton for an Android application,
121: remote -&gt; de.akquinet.android.archetypes:android-with-test (Creates a skeleton for an Android application and instrumentation tests)
122: remote -&gt; de.akquinet.android.archetypes:stand-archetype (Creates a skeleton for an Android application using the Stand framework stack)
531: remote -&gt; org.eclipse.xtend:xtend-android-archetype (-)
826: remote -&gt; ru.nikitav.android.archetypes:release (-)
827: remote -&gt; ru.nikitav.android.archetypes:release-robolectric (-)
^C

Keep ID 119 in mind and enter it.

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 296: 119

Choose a version (latest recommend)

Choose de.akquinet.android.archetypes:android-quickstart version: 
1: 1.0.0
2: 1.0.1
3: 1.0.2
4: 1.0.3
5: 1.0.4
6: 1.0.5
7: 1.0.6
8: 1.0.7
9: 1.0.8
10: 1.0.9
11: 1.0.10
12: 1.0.11

Define a groupId, artefactId, version, package etc. and confirm with Y:

Define value for property 'groupId': : de.ingoreschke.annuitycalculator
Define value for property 'artifactId': : app-full
Define value for property 'version':  1.0-SNAPSHOT: : 1.0.0
Define value for property 'package':  de.ingoreschke.annuitycalculator: : de.ingoreschke.annuitycalculator.full
Define value for property 'android-plugin-version':  3.6.0: : 
Define value for property 'emulator':  not-specified: : 
Define value for property 'platform':  16: : 17
Confirm properties configuration:
groupId: de.ingoreschke.annuitycalculator
artifactId: app-full
version: 1.0.0
package: de.ingoreschke.annuitycalculator.full
android-plugin-version: 3.6.0
emulator: not-specified
platform: 16

New Module in Main pom.xml

<?xml version="1.0" encoding="UTF-8"?>
  2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.o
  3   <modelVersion>4.0.0</modelVersion>
  4   <groupId>de.ingoreschke</groupId>
  5   <artifactId>annuitycalculator</artifactId>
  6   <version>0.0.1-SNAPSHOT</version>
  7   <packaging>pom</packaging>
  8   <name>Main Project Folder</name>
  9   <description>This will be hold all sub projects Android, Java, Website to Annuity Calculator Project</description>
 10   <modules>
 11     <module>core</module>
 12     <module>app_full</module>
 13   </modules>
 14 </project>

Pom.xml in new Project app_full

<?xml version="1.0" encoding="UTF-8"?>
  2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.o
  3     <modelVersion>4.0.0</modelVersion>
  4     <parent>
  5     <artifactId>annuitycalculator</artifactId>
  6     <groupId>de.ingoreschke</groupId>
  7     <version>0.0.1-SNAPSHOT</version>
  8   </parent>
  9     <groupId>de.ingoreschke.annuitycalculator</groupId>
 10     <artifactId>app_full</artifactId>
 11     <version>1.0-SNAPSHOT</version>
 12     <packaging>apk</packaging>
 13     <name>app_full</name>
 14     <properties>
 15         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 16         <platform.version>4.1.1.4</platform.version>
 17         <android.plugin.version>3.6.0</android.plugin.version>
 18     </properties>
 19     <dependencies>
 20         <dependency>
 21             <groupId>com.google.android</groupId>
 22             <artifactId>android</artifactId>
 23             <version>${platform.version}</version>
 24             <scope>provided</scope>
 25         </dependency>
 26     </dependencies>
 27     <build>
 28         <finalName>${project.artifactId}</finalName>
 29         <pluginManagement>
 30             <plugins>
 31                 <plugin>
 32                     <groupId>com.jayway.maven.plugins.android.generation2</groupId>
 33                     <artifactId>android-maven-plugin</artifactId>
 34                     <version>${android.plugin.version}</version>
 35                     <extensions>true</extensions>
 36                 </plugin>
 37             </plugins>
 38         </pluginManagement>
 39         <plugins>
 40             <plugin>
 41                 <groupId>com.jayway.maven.plugins.android.generation2</groupId>
 42                 <artifactId>android-maven-plugin</artifactId>
 43                 <configuration>
 44                     <sdk>
 45                         <platform>16</platform>
 46                     </sdk>
 47                 </configuration>
 48             </plugin>
 49         </plugins>
 50     </build>
 51 </project>
<pre>
 
<pre lang="bash">mvn clean install

In Eclipse
Import the new Maven Modul.
After Import I got a Error:
Project 'app_full' is missing required source folder: 'src/test/java'
Fixed it by adding a folder test/java into src.
Bildschirmfoto 2013-09-11 um 00.28.35

Source: a screencast found on youtube. http://www.youtube.com/watch?v=S7XDsivkVUA

Expected FS format ‘2’; found format ‘4’

Wie ich schon in einem früheren Blog beschrieb, sind hier die Versionen vom Server und Client unterschiedlich.

Gute Artikel hierzu:

http://www.coderanch.com/t/106547/vc/Difference-between-subversion-subclipse

http://subversion.apache.org/docs/release-notes/1.6.html

Nach dem ich alle meine Clients (Tortoise und Subclipse) per Update auf den neuesten Stand gebracht habe, erhielt ich immernoch dieselbe Fehlermeldung.

Offensichtlich sind die Clients (noch) nicht mit dem erstellten Repository kompatible.
Nach einigen recherchen fand ich heraus das dem create Befehle einen Parameter für Abwärtskompatibilität mitgeben kann.

svnadmin create --pre-1.5-compatible d:/SVN/(projekt)

Eclipse Shortcuts

Alle die viel mit dem Computer arbeiten wissen, das Shortcuts einem das Leben enorm erleichtern.
Einziges Problem man muß sie kennen.
Da ich, als Programmierer, täglich mit Epclipse arbeite, habe ich mich auf die Suche nach Shortcut-Listen für Eclipse gemacht. Und was soll ich sagen es gibt tausende.
Hier einige ausgewählte.

Auch ganz nett um seine wichtigsten Shortcuts schnell zu lernen, der Shortcut-Trainer. Ein nerviges Plugin welches einem immer den Shortcut anzeigt wenn man sich über das Menü durchklickt.
http://www.mousefeed.com/
Ein netter Artikel dazu http://www.wolfgangschoch.com/blog/788-eclipse-shortcuts-trainer.html

Meine Lieblings-shortcuts

F4
Zeigt die Hierachie an. Sehr nützlich. Von welchem Classe wird abgeleitet? Welche weiteren Ableitungen gibt es?
Ctrl + Leertaste
Verfügbare Methoden anzeigen, Autovervollständigung
Ctrl + 1
Quickfix öffnen. Wenn ein Methodeaufruf einen error meldet. Cursor drauf und Ctrl+1. Quickfix Vorschläge werden angezeigt
Ctrl + Shift + O
Imports Organisieren (überflüssige löschen, notwendige hinzufügen)
Ctrl + Shift + G
zeige alle Referencen im Workspace.
Ctrl + s
Speichern
Alt + Shift + J
Javadoc comment skeleton erstellen.
Shift + F2
Javadoc aufrufen. (Java) mit Cusor auf einem Klassennamen. Es wird die API aufgerufen und zur Beschreibung der Klasse oder Methode gesprungen.
ALT + Pfeil Hoch / Pfeil Runter
Verschiebt die Zeile unter dem Cursor.
Ctrl + Shift + L
Zeigt alle verfügbaren Shortcuts an

Hinweis

Die hier aufgelisteten Shortcuts beziehen sich auf eine “normale” Eclips Installation mit Java Plugins.
Es gibt ja auch IDE´s, z.B. ColdFusion Builder, die auf Basis von Eclipse erstellt wurden. Diese IDE´s haben mitunter andere Shortcuts bzw. nicht die selben oder auch einfach nur deaktiviert.

Coldfusion Builder
Die Shortcuts für den Coldfusion Builder lassen sich wie folgt anzeigen.
Help -> Key Assist…

Meine Lieblings-shortcuts für den CF-Builder

Ctrl + Shift + D
cfdump var =”##”
Ctrl + Shift + O
umschließendes cfoutput … /cfoutput
Ctrl + Shift + H
umschließendes # … #
Ctrl + Shift + M
umschließendes Kommentar. Aus,- und Einkommentieren.

Diese Liste ist auch im Coldfusion Blog veröffentlicht.
http://www.coldfusion-blog.de/2010/09/16/685/

JUnit 4 Tutorial

Nachdem Junit 4 in eclipse eingebunden wurde kann es benutzt werden, um Methoden automatisiert zu testen.

Eine einfache Klasse mit einer sehr einfachen Methode.
BasicArithmetics – Klasse.

package ingoreschke;
 
public class BasicArithmetics {
	/*Just a method to calculate the sum of 2 ints*/
	public static int sumInt(int val1, int val2){
		return val1 + val2;
	}
}

Die statische Methode sumInt(int val1, int val2) der Klasse soll 2 beliebige int Werte addieren.
Ob diese Methode korrekt funktioniert muß getestet werden.
7 = 3+4;
Erwartet wird, wenn der Methode 3, und 4 übergeben wird, dass sie 7 zurückliefert.
Nun die Testklasse und Testmethode dazu.
BasicArithmeticTest

package ingoreschke;
 
import org.junit.Assert;
import org.junit.Test;
 
public class BasicArithemticsTest {
	/*test whether the method sumInt() calculates the sum of 3+4=7*/
	@Test
	public void testSumInt(){
		Assert.assertEquals("Result of Sum", 7, BasicArithmetics.sumInt(3, 4) );
	}
}

Um den JUnit Test durchzuführen

  • rechte Maustaste auf die Testklasse (BasicArithmeticsTest)
  • Run As wählen
  • JUnit Test

In der JUnit View sollte so etwa zu sehen sein.

Grün = Test bestanden.

Nun erweitern wir die BasicArithmetic – Klasse um eine Methode die 2 int Werte differenziert.
Da die Differenz 2er natürlicher Zahlen auch gebrochene Zahlen hervorbringen kann geben wir double zurück.

/*Just calculate the difference between 2 ints*/
public static double diffInt(int val1, int val2){
	return val1/val2;			
}

Eine Testmethode dazu 5=10/2;

 /*test the method diffInt() */
@Test
public void testDiffInt(){
	Assert.assertEquals("Difference between 10 and 2", 5, BasicArithmetics.diffInt(10, 2),1);
}

Dies ist einfach und sollte auch mit grün druchlaufen.
Da auch gebrochene Zahlen entstehen können wird auch das getestet.

@Test
public void testDiffInt2(){
	Assert.assertEquals("Difference between 9 and 2", 4.5, BasicArithmetics.diffInt(9, 2),1);
}

Diese Methode wird auch mit Grün = Bestanden quittiert.
Hier sehen wir nun schon den Vorteil von automatisierten Tests gegenüber der “standard main – Methode.Wo manuell das Ergebniss kontrolliert werden muß. Diese JUnit tests können beliebig of durchgeführt werden.

Um gute Tests zu schreiben gehört es dazu, so genannte Bad Tests zu schreiben.
D.h. Ein Test gilt als bestanden wenn die zu testene Methoden einen vorhergesagten Fehler schmeißt.
In unseren Beispiel bei der Division durch 0.

@Test
public void testDiffInt3(){
	BasicArithmetics.diffInt(10,0);
}

schlägt also wie erwartet Fehl (Rot).
Im Fehler Trace – View kann man übrigens den Stacktrace sehen.

Damit der Test als bestanden gilt muß der Testmethode gesagt werden das wir diese Exception erwarten.
Dies tut man in der Annotation
@Test(expected = ArithmeticException.class)

@Test(expected = ArithmeticException.class)
	public void testDiffInt3(){
		BasicArithmetics.diffInt(10,0);
	}

Nun ist auch dieser Test bestanden.

Hier nochmal der komplette Sourcecode
BasicArithmetics

package ingoreschke;
 
import javax.print.attribute.standard.Finishings;
 
public class BasicArithmetics {
 
	/*Just a method to calculate the sum of 2 ints*/
	public static int sumInt(int val1, int val2){
		return val1 + val2;
	}
 
	/*Just calculate the difference between 2 ints*/
	public static double diffInt(int val1, int val2){
		return val1/val2;			
	}
}

BasicArithmeticsTest.java

package ingoreschke;
 
import org.junit.Assert;
import org.junit.Test;
 
public class BasicArithemticsTest {
 
	/*test whether the method sumInt() calculates the sum of 3+4=7*/
	@Test
	public void testSumInt(){
		Assert.assertEquals("Result of Sum", 7, BasicArithmetics.sumInt(3, 4) );
	}
	/*test the method diffInt() */
	@Test
	public void testDiffInt(){
		Assert.assertEquals("Difference between 10 and 2", 5, BasicArithmetics.diffInt(10, 2),1);
	}
 
	@Test
	public void testDiffInt2(){
		Assert.assertEquals("Difference between 9 and 2", 4.5, BasicArithmetics.diffInt(9, 2),1);
	}
	@Test(expected = ArithmeticException.class)
	public void testDiffInt3(){
		BasicArithmetics.diffInt(10,0);
	}
}

sourcecode als zip – Datei

weiterführende Links: