Archive
How to install Glassfish 3.1 Clustering on multiple hosts using linux command line
Today a colleague needed help with setting up a Glassfish cluster and I remembered having read a very good tutorial that created the entire cluster using only asadmin commands. In my experience using only asadmin commands not only gives you a greater understanding of the way Glassfish works internally but also enables you to create scripts for Glassfish administration commands.
Anyway, I managed to find the blogpost that I read about a year ago and decided that it was a good link to share with the world: http://www.randombugs.com/java/glassfish/installing-glassfish-31-cluster-debian-60-command-line.html
How to connect Glassfish 3 to an external ActiveMQ 5 broker
Introduction
Here at ONVZ we’re using Glassfish 3 as our development and production application server, and we’re quite happy with its performance and stability, as well as the large community surrounding it. I rarely run into a problem that does not have a matching solution on stackoverflow or java.net. As part of our open source strategy we also run a customized ActiveMQ cluster called “ONVZ Message Bus”.
To enable Message Driven Beans and other EJBs to consume and produce messages to and from the ActiveMQ message brokers, ignoring the internal OpenMQ broker that comes shipped with Glassfish, an ActiveMQ Resource Adapter has to be installed. Luckily for me Sven Hafner wrote a blog post about running an embedded ActiveMQ 5 broker in Glassfish 3, and I was able to distill the information I needed to connect to an external broker instead. This blog post describes what I did to get it to work.
Maven best practices
Although Maven offers a “convention over configuration” solution, there is still more then enough configuration necessary to cause some serious headache. In this post I will share some best practices with you that will ease maintenance of your POM files.
How to add jars to your Maven project
If you want to physically add jar files to your maven project, so they don’t have to be downloaded from a repository, you can use the system dependency scope, and point to a location in your project:
<dependency>
<groupId>com.missionmode</groupId>
<artifactId>missionmode-api</artifactId>
<version>3.6.51</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/MMAPI-3.6.51.jar</systemPath>
</dependency>
How to create a webservice client with Maven and JAX-WS
Maven allows you to integrate the generation of a JAX-WS webservice client into your build process. To do this, do the following:
1. Create a new module for the webservice client in your maven project.
2. Add the following configuration to the pom.xml of the new module:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.10</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<configuration>
<packageName>nl.interact.ipds.agentvi.connector.schema</packageName>
<wsdlUrls>
<wsdlUrl>http://www.ignyte.com/webservices/ignyte.whatsshowing.webservice/moviefunctions.asmx?wsdl</wsdlUrl>
</wsdlUrls>
<extension>true</extension>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-tools</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.jvnet</groupId>
<artifactId>mimepull</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
3. The jar that maven generates with the above config, can be used to write a client program like the following:
MovieInformation info = new MovieInformation();
ArrayOfTheater theaters = info.getMovieInformationSoap12().getTheatersAndMovies(“10001″, 1);
for (Theater t : theaters.getTheater()) {
System.out.println(“Theatre: “+t.getName()+”, “+t.getAddress());
ArrayOfMovie movies = t.getMovies();
for (Movie m : movies.getMovie()) {
System.out.println(” -”+m.getName()+”, (Rating: “+m.getRating()+”)”);
}
}
Why the “MAVEN2_CLASSPATH_CONTAINER will not be exported or published”
On certain occasions Eclipse will present you with the following warning:
Classpath entry org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER will not be exported or published. Runtime ClassNotFoundExceptions may result.
So solve this, do the following:
- Open the properties of the project that generates this warning
- Click on “Java Build Path”
- Click on the tab “Order and Export”
- Enable “Maven Dependencies”
- Click on “Ok”
- Open the “Problems” view
- Select the warning we are trying to solve, and press “Ctrl-1″
- Click on “Ok”
The problem is now solved. It may take some time before the warning disapears because the project needs to rebuild before it goes away.
Why my JAXB generated classes didn’t show up in the packaged jar
The following problem bugged me for like 2 days:
My maven project generates classes using a maven jaxb2 plugin, but it also inherits settings from a parent project. After running “maven package” and seeing the jaxb plugin generate classes from the schema i was surprised to see zero classes showing up in the created jar file. After many hours of commenting out pieces of maven configuration in both my project and in the parent i found out that the “fork” setting on the compiler plugin was set to “true”. This didn’t seem like a setting that was causing the problem, but when i switched it to false the problem was suddenly sovled and my beloved classes settled nicely in the generated jar file.
I still don’t know why this setting causes the problem, but if you have the same problem you have now found the solution!
How to load an XML file from the classpath
Saagar writes the following on his blog:
Today, I faced this issue in Java coding. I needed to load an XML file which was in my classpath but not in the same directory as the classes. The deliverable was a jar and the properties and the configuration XML files were in a different folder and were appended to the classpath at the runtime. The issue was that the file could not be located through the the statement
String fileName = getClass.getSystemResource(“config.xml”).getFile;
Then I thought that it checks relative to the current class and so used the statement
String fileName = ClassLoader.getSystemResource(“config.xml”).getFile;
But then, it wouldn’t still recognize the file. The reason is the same, it checks relative to the classes folder. I did not want to get the classpath from the system and browse through it for the config file since the class path could get larger. A couple of google searches and a little research later, I found the solution. The workaround is by using the following statement
String fileName = Thread.currentThread().getContextClassLoader().getResource(“config.xml”).getFile;
It only makes sense since in the above statement, you get hold of the context class loader and find the path in the entire classpath…
How to Create an SMF Manifest
Check out the following documentation from Sun on creating SMF Manifests.
http://www.sun.com/software/solaris/howtoguides/smfmanifesthowto.jsp
Note the links at the bottom of the page for more useful resources on SMF.
Why JPA refuses to persist Group objects
Problem
When working in Java using tools like JPA you sometimes forget to keep the limitations of the underlying database in mind. I spend about an hour trying to find out why my custom Group objects didn’t get persisted, and MySQL complained about incorrect SQL syntax.