Search code examples
mavenjakarta-eeglassfish

Why does Glassfish not recognize the jar?


I want to deploy a jar on glassfish 4 with the command asadmin deploy testapp-1.0-SNAPSHOT.jar in the terminal. The complete layout of the jar is

/META-INF/MANIFEST.MF
/META-INF/maven/com.test/testapp/pom.properties
/META-INF/maven/com.test/testapp/pom.xml
/com/test/testapp/*.class

But every time i get the error

remote failure: Archive type of jar was not recognized
Command deploy failed.

I compile and package the jar with maven.

Thanks in advance.


Solution

  • It seems like individual jar's can only be deployed if they contain Enterprise Java Beans.

    There are two options to make a class an Enterprise Java Bean.

    1. Annotate the class with a component defining annotation from the package javax.ejb (e.g. javax.ejb.Stateless)

    2. Specify the Enterprise Java Beans in the deployment descriptor ejb-jar.xml (or glassfish-ejb-jar.xml if using Glassfish) packaged in the META-INF directory as illustrated in 5.2 Packaging Enterprise Beans

    This is a simple example taken from Simple Stateless with Descriptor

    <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
             version="3.0">
      <enterprise-beans>
        <session>
          <ejb-name>CalculatorImpl</ejb-name>
          <business-local>org.superbiz.calculator.CalculatorLocal</business-local>
          <business-remote>org.superbiz.calculator.CalculatorRemote</business-remote>
          <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
          <session-type>Stateless</session-type>
          <transaction-type>Container</transaction-type>
        </session>
      </enterprise-beans>
    </ejb-jar>