Matt RaibleMatt Raible is a Web Developer and Java Champion. Connect with him on LinkedIn.

The Angular Mini-Book The Angular Mini-Book is a guide to getting started with Angular. You'll learn how to develop a bare-bones application, test it, and deploy it. Then you'll move on to adding Bootstrap, Angular Material, continuous integration, and authentication.

Spring Boot is a popular framework for building REST APIs. You'll learn how to integrate Angular with Spring Boot and use security best practices like HTTPS and a content security policy.

For book updates, follow @angular_book on Twitter.

The JHipster Mini-Book The JHipster Mini-Book is a guide to getting started with hip technologies today: Angular, Bootstrap, and Spring Boot. All of these frameworks are wrapped up in an easy-to-use project called JHipster.

This book shows you how to build an app with JHipster, and guides you through the plethora of tools, techniques and options you can use. Furthermore, it explains the UI and API building blocks so you understand the underpinnings of your great application.

For book updates, follow @jhipster-book on Twitter.


Over 10 years ago, I wrote my first blog post. Since then, I've authored books, had kids, traveled the world, found Trish and blogged about it all.

Upgraded to Roller 1.0

Dave released Roller 1.0 yesterday, so I decided to spend 20 minutes and upgrade today. I have customized a few pieces in Roller and added a bunch of my own files, so I always build from CVS for this site. I did find a bug with twisty comments (fixed in CVS) when testing locally, but everything else appears to be working OK. Let me know if you see any issues and feel free to play with my test user if you like. Username is "test", password is "roller". Well done Dave!

Update: Remember Me seems to be broken. I thought I fixed it last week. I'll investigate further tomorrow.

Update 2: Strange... it works when I test it locally, but not on this site.

Solved: It turned out to be related to installing Roller as the root app, and only seems to affect Firefox. Fixed in CVS.

Posted in Roller at Jan 15 2005, 04:27:18 PM MST Add a Comment

AppFuse distributed with Gentoo Linux?

According to the Gentoo Java Roadmap, AppFuse is on the list of apps to integrate. Nice! I'm going to rebuild my Windows 2000 Server as a Suse 9.2 box in the next couple of weeks, but I might have to reconsider and go with Gentoo. I was going to buy a gig o' RAM for the box, but it looks pretty spendy.

Today I added another item for AppFuse 1.8 in the roadmap: create an installer using MyJavaPack that can install Ant, AppFuse, MySQL and Tomcat. Basically, give developer's a way to install and start developing with AppFuse in under 5 minutes. Let me know if you're interested in helping out with this.

Posted in Java at Jan 15 2005, 03:30:10 PM MST 4 Comments

G5 Powerbooks in July?

According to quite a few sources, Apple will be shipping PowerBook G5s in the next 6 months. The timing sounds right. Tiger will be shipping by the Developer's conference and they need to announce something big - so G5 Laptops sounds like a logical choice. I can wait 6 months - where can I pre-order a 17"?

Posted in Mac OS X at Jan 15 2005, 03:10:58 PM MST 7 Comments

Running Cargo from Maven

Yesterday, I integrated Cargo into our application so we could start/stop Tomcat before running our jWebUnit tests. I use Cargo in AppFuse and Equinox - which are both Ant-based. Since we're using Maven on our project, I had to do a bit of futzing to get Cargo integrated into Maven. I prefer to use the Ant tasks from Cargo than the programmatic API because it's nice to run your tests when you start Tomcat manually. If you use the programmatic API, and start/stop Tomcat in setUp()/tearDown() methods - your test will fail if Tomcat is already running.

Below is what I added to maven.xml. With this, we can run "maven test-web" to test our UI with Tomcat running or "maven test-tomcat" to start/stop Tomcat before running our tests. Now I just need to figure out the best way to configure the proper port in my jWebUnit test. I'll probably put it into and the read the value as part of my test. I've also included a "deploy" goal in this example to demonstrate an easy way to deploy to Tomcat.

    <property environment="env"/>
    <property name="maven.tomcat.home" value="${env.CATALINA_HOME}"/>

    <!-- deploy the directory created by war:webapp to tomcat/webapps -->
    <goal name="deploy" prereqs="war:webapp">
        <copy todir="${maven.tomcat.home}/webapps">
            <fileset dir="${}">
                <include name="${pom.artifactId}/**"/>

    <goal name="test-tomcat" prereqs="war:war"
        description="Starts Tomcat, runs jWebUnit tests, stops Tomcat">

        <taskdef resource="cargo.tasks" classpathref="maven.dependency.classpath"/>

        <cargo-tomcat5x homeDir="${maven.tomcat.home}"
            output="${maven.test.dest}/cargo.log" action="start" >
            <war warFile="${}/${}"/>
            <configuration dir="${maven.test.dest}/tomcat5x">
                <property name="cargo.logging" value="high"/>
                <property name="cargo.servlet.port" value="8280"/>
        <attainGoal name="test-web"/>
        <cargo-tomcat5x homeDir="${maven.tomcat.home}" action="stop"/>

    <goal name="test-web" prereqs="test:compile" description="Runs JUnit tests">

      <taskdef name="junit"
        <mkdir dir="${maven.test.reportsDirectory}"/>
        <junit printsummary="no" errorProperty="test.failed" 
                <pathelement location="${maven.test.dest}"/>
                <pathelement location="${}"/>
                <path refid="maven.dependency.classpath"/>
                <path location="web"/>
            <formatter type="xml"/>
            <formatter type="brief" usefile="false"/>
            <batchtest todir="${maven.test.reportsDirectory}" if="testcase">
                <fileset dir="${maven.test.dest}">
                    <include name="**/*${testcase}*"/>
                    <exclude name="**/*TestCase.class"/>
                    <exclude name="**/*$*.class"/>
            <batchtest todir="${maven.test.reportsDirectory}" unless="testcase">
                <fileset dir="${maven.test.dest}">
                    <include name="**/*WebTest.class"/>

        <fail if="test.failed">
          Unit tests failed. For error messages, check the log files in

Posted in Java at Jan 15 2005, 02:15:05 PM MST 2 Comments