Bash Completion

Jag drog nyss in en ny installation av Ubuntu 12.10 och av okänd anledning var inte bash completion (eller autocompletion) funkis. Visade sig att i /etc/bash.bashrc var följande rader utkommenterade, vilket jag ändrade och sedan var allt grönt igen.

# enable bash completion in interactive shells
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

Jag använder oftast ihop med sudo aptiTAB instTAB progrTAB, men det finns även maven och gradle completions!

Vettig Maven JSLint-plugin

Äntligen en ordentlig maven-plugin som kör jslint på javascript-koden. Version 2.0.2 har bättre dokumentation än 2.0.1. Här är en snippet från en pom:

<project ...>
	<build>
		<plugins>
			<plugin>
				<groupid>com.googlecode.jslint4java</groupid>
				<artifactid>jslint4java-maven-plugin</artifactid>
				<version>2.0.2</version>
				<executions>
					<execution>
						<id>lint</id>
						<phase>compile</phase>
						<goals>
							<goal>lint</goal>
						</goals>
						<configuration>
							<sourcefolders>
								<sourcefolder>${basedir}/src/main/webapp/js</sourcefolder>
							</sourcefolders>
							<failonerror>true</failonerror>
							<options>
								<browser>true</browser>
								<forin>true</forin>
								<fragment>true</fragment>
								<undef>true</undef>
								<nomen>true</nomen>
								<plusplus>true</plusplus>
								<predef>Ext,jQuery</predef>
								<sloppy>true</sloppy>
								<vars>true</vars>
								<white>true</white>
							</options>
						</configuration>
					</execution>
				</executions>
			</plugin>
</plugins></build></project>

Eclipse Workspace Code Style

I maven-eclipse-pluginen kan man sätta upp detta för sin workspace:

<workspacecodestylesurl>http://svn.apache.org/repos/asf/maven/plugins/trunk/maven-eclipse-plugin/src/optional/eclipse-config/maven-styles.xml</workspacecodestylesurl>

Build.version

Med hjälp av MANIFEST

<build><plugins><plugin>
				<groupid>org.codehaus.mojo</groupid>
				<artifactid>maven-buildnumber-plugin</artifactid>
				<version>0.9.6</version>
				<executions>
					<execution>
						<phase>validate</phase>
						<goals>
							<goal>create</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
</plugins></build>

Denna plugin kräver att man satt upp SCM ordentligt så att versionnummer kan hämtas därifrån!

<build><plugins><plugin>
				<groupid>org.apache.maven.plugins</groupid>
				<artifactid>maven-war-plugin</artifactid>
				<version>2.0</version>
				<configuration>
					<archive>
						<manifestentries>
							<implementation -Build>${buildNumber}</implementation>
						</manifestentries>
					</archive>
				</configuration>
			</plugin>
</plugins></build>
	private String readBuildNumber(ServletContext servletContext) {
		try {
			URL resource = servletContext.getResource("/META-INF/MANIFEST.MF");
			InputStream manifestStream = resource.openStream();
			Manifest mf = new Manifest(manifestStream);
			Attributes atts = mf.getMainAttributes();
			String value = atts.getValue("Implementation-Build");
			if (value == null) {
				throw new IllegalArgumentException("Implementation-Build attribute is not set in MANIFEST " + resource.toExternalForm());
			}
			manifestStream.close();
			return value;
		} catch (Exception e) {
			throw new IllegalStateException("Failed to read Implementation-Build attribute from MANIFEST.MF");
		}
	}

Eller som vanlig resource (properties)

<build>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
</build>

Utvecklingsstack – för Java

Jag har funderat lite på vilken stack jag föredrar och nu såhär sent på kvällen skriver jag ihop:

  • JIRA
  • DokuWiki
  • Hudson
  • Sonar
  • Nexus / Archiva
  • Git

Egentligen behövs två kategorier: en fri (gratis) och en betalvariant. Tanken väcktes av att jag såg Markus M. May paketera sin favoritstack för ArchLinux (tidigare Ubuntu, men gav upp detta). Det händer ju ett par gånger om året att just detta behöver sättas upp för ett projekt – att ha en färdig “blob” att bara slänga igång hade ju inte varit fel. Kanske en Xen image (Gandi hosting om man inte vill köra AMI/Amazon) eller bara en stor zip klar att sparkas igång med ett bash-script, …

Projekt- och ärendehantering

JIRA – en klassiker som fungerar även i större sammanhang. Kan knytas in till confluence. Projekt, komponenter, milstolpar, olika flöden, watchers, voters, rapporter, ärende-relationer, … Icke-gratis och icke-fri.

Mingle är en vacker produkt som jag inte är övertygad vara värd sin kostnad. Mest web 2.0-ig av alla och mest planeringsvänlig (dra-och-släpp med bäst översikt av tillgängligt material). Icke-gratis och icke-fri.

VersionOne – otestad.

BugZilla – klassiker som är för enkel för min smak.

RedMine – tyvärr otestad ruby-historia som ser kompetent ut på pappret. Verkar sakna ärende-relationer såsom liknar, ersätter, beror på, …

Trac – ärendehanteringen i trac är kass och för enkel.

Wiki

DokuWiki – enklast, snabbast, smidigast, rättframmast. Gör jobbet och det är trevligt att jobba med.

Trac – wikin i Trac fungerar ok. Trevligt när man kan länka till kod så lätt.

MediaWiki – no no.

Confluence – hat-kärlek. Ingen redigering av stycken, editorn buggig och saknar en hel del av TinyMCE:s “kraft”.

Källkodrepositorie

Git – har inte varit fri från strul, och strulet har inte varit helt idiotsäkert att fixa till. Men distribuerat, snabbt och enkelt att komma igång.

Mercurial (hg) – otestat, skall kunna mäta sig med git och till och med vara “finare” i vissa avseenden, t ex hur lång livslängden på en branch är.

SVN, CVS – klassiker som trots allt fungerar ganska långt för mindre team.

Mavenbibliotek

Archiva – trotjänare som trots allt fungerat stabilt under långa perioder. En aning gammalmodig med lösenordspenalism t ex.

Nexus – otestad, men vacker i publika installationer och på pappret. Mindre minnesavtryck (memory footprint) är ju inte fel.

Bygg- och CI-motor

Hudson – en klar favorit.

Continuum, Cruise Control – är lite samma sak för mig: en hög XML och inget som inte Hudson har. (Var länge sedan jag körde dessa dock.)

Övriga verktyg

Sonar – alla rapporter som kan genereras automatiskt bör genereras. När man får upp farten gäller det att hålla kurs så man inte hamnar i dolda teknisk skuld-fällor.

maven, pom.xml och site:site

Idag stötte jag på ett problem jag inte sett tidigare och som Google inte kunde “lösa” åt mig. Feletrapporten såg ut såhär:

[INFO] Unable to load parent project from a relative path: Could not find the model file '/users/fwendt/release/Corporation/Home/target/checkout/../pom.xml'. for project unknown
[INFO] Parent project loaded from repository.
[INFO] Parent project loaded from repository.
[INFO] Parent project loaded from repository.
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error parsing site descriptor
Embedded error: expected = after attribute name (position: START_DOCUMENT seen ...itations\r\nunder the License.\r\n-->\r\n\r\n<project name="Corporation "Home"... @21:30)
[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: Error parsing site descriptor
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:583)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:512)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:482)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:330)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:291)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:142)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:336)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:129)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:287)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error parsing site descriptor
at org.apache.maven.plugins.site.AbstractSiteRenderingMojo.readDecorationModel(AbstractSiteRenderingMojo.java:279)
at org.apache.maven.plugins.site.AbstractSiteRenderingMojo.getDecorationModel(AbstractSiteRenderingMojo.java:554)
at org.apache.maven.plugins.site.AbstractSiteRenderingMojo.createSiteRenderingContext(AbstractSiteRenderingMojo.java:466)
at org.apache.maven.plugins.site.SiteMojo.renderLocale(SiteMojo.java:113)
at org.apache.maven.plugins.site.SiteMojo.execute(SiteMojo.java:96)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:451)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:558)
... 16 more
Caused by: org.codehaus.plexus.util.xml.pull.XmlPullParserException: expected = after attribute name (position: START_DOCUMENT seen ...itations\r\nunder the License.\r\n-->\r\n\r\n<project name="Corporation "Home"... @21:30)
at org.codehaus.plexus.util.xml.pull.MXParser.parseAttribute(MXParser.java:2004)
at org.codehaus.plexus.util.xml.pull.MXParser.parseStartTag(MXParser.java:1799)
at org.codehaus.plexus.util.xml.pull.MXParser.parseProlog(MXParser.java:1479)
at org.codehaus.plexus.util.xml.pull.MXParser.nextImpl(MXParser.java:1395)
at org.codehaus.plexus.util.xml.pull.MXParser.next(MXParser.java:1093)
at org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Reader.read(DecorationXpp3Reader.java:1144)
at org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Reader.read(DecorationXpp3Reader.java:1156)
at org.apache.maven.plugins.site.AbstractSiteRenderingMojo.readDecorationModel(AbstractSiteRenderingMojo.java:275)
... 22 more

Det visade sig efter att ha tittat på utdatan X antal gånger att det hela kommer från att det fanns citationstecken i pom:ens name-fält (och descriptor) – något som site:site inte accepterade.

Original:

<project>
<name>Corporation "Home" Web Application</name>
<description>Corporation "Home" Web Application</description>

Lösning:

<project>
<name>Corporation Home Web Application</name>
<description>Corporation Home Web Application</description>