Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

When you try to use Glassfish 3.x or Glassfish 4.x with Derby datasources, you might run into issues where Glassfish doesn't start, and the Glassfish logs show you messages such as the below:

Code Block
titleGlassfish error log
java.lang.SecurityException: sealing violation: package org.apache.derby is sealed

This is because Glassfish is already shipped with Derby, and the Glassfish class loaders do not know how to the manage the situation where the same class is duplicated. So, the solution is to simply remove the Derby JAR from dependencies; on the other hand this is not feasible if you are using the same CARGO profile with different containers. Here is how you can work around the issue:

Code Block
titleWorkaround with the Maven2/Maven3 plugin
languagehtml/xml
<dependencies>
  <dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>${derby.version}</version>
    <scope>test</scope>
  </dependency>
</dependencies>

  ...

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.cargo</groupId>
      <artifactId>cargo-maven2-plugin</artifactId>
      <version>${cargo.version}</version>
      <!--
        This configuration will be used in general.
        -->
      <configuration>
        <container>
          <dependencies>
            <dependency>
              <groupId>org.apache.derby</groupId>
              <artifactId>derby</artifactId>
            </dependency>
          </dependencies>
          <systemProperties>
            <derby.system.home>\${project.build.directory}/derby</derby.system.home>
          </systemProperties>
        </container>
        <configuration>
          <properties>
            <cargo.datasource.datasource.derby>
                cargo.datasource.driver=org.apache.derby.jdbc.EmbeddedDriver|
                cargo.datasource.url=jdbc:derby:derbyDB;create=true|
                cargo.datasource.jndi=jdbc/CargoDS|
                cargo.datasource.username=APP|
                cargo.datasource.password=nonemptypassword
            </cargo.datasource.datasource.derby>
          </properties>
        </configuration>

          ...

      </configuration>
    </plugin>
  </plugins>
</build>

<profiles>

    ...

  <profile>
    <id>glassfish3x</id>
    <build>
      <pluginManagement>
        <plugins>
          <plugin>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-maven2-plugin</artifactId>
            <configuration>
              <container>
                <containerId>glassfish3x</containerId>
                <artifactInstaller>
                  <groupId>org.glassfish.main.distributions</groupId>
                  <artifactId>glassfish</artifactId>
                  <version>3.1.2.2</version>
                </artifactInstaller>
                <dependencies>
                  <!--
                    Remove the org.apache.derby dependency since GlassFish 3.x is already
                    shipped with Derby, and adding the dependency twice results in a
                    java.lang.SecurityException: sealing violation: package org.apache.derby.
                    -->
                    <dependency>
                      <groupId>org.apache.derby</groupId>
                      <artifactId>derby</artifactId>
                      <classpath>none</classpath>
                    </dependency>
                </dependencies>
              </container>
            </configuration>
          </plugin>
        </plugins>
      </pluginManagement>
    </build>
  </profile>
</profiles>

...

Users of the Maven2/Maven3 plugin can use the Maven2 Archetype showing datasource support. Please read: Datasource Definition Archetype.