Java

Jersey

  1. Verifica la disponibilidad de Java y Maven:

    [alumno@servidor ~]$ which java
    /usr/lib/java/bin/java
    [alumno@servidor ~]$ which mvn
    /usr/bin/mvn
    [alumno@servidor ~]$ java -version
    java version "1.8.0_51"
    Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
    Java HotSpot(TM) Client VM (build 25.51-b03, mixed mode)
    [alumno@servidor ~]$ mvn -version
    Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 10:22:22-0500)
    Maven home: /usr/share/maven
    Java version: 1.8.0_51, vendor: Oracle Corporation
    Java home: /usr/lib/java/jre
    Default locale: es_MX, platform encoding: UTF-8
    OS name: "linux", version: "3.10.17-smp", arch: "i386", family: "unix"
    
  2. Crea el directorio donde residirá tu proyecto (jersey) y accede a él:

    [alumno@servidor ~]$ mkdir -p /home/alumno/www/jersey
    [alumno@servidor ~]$ cd /home/alumno/www/jersey/
    
  3. Crea la estructura del proyecto para Jersey mediante Maven, haciendo uso de Grizzly como provedor del servicio de HTTP ("servidor HTTP"):

    alumno@servidor jersey]$ mvn archetype:generate \
      -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
      -DarchetypeGroupId=org.glassfish.jersey.archetypes \
      -DinteractiveMode=false \
      -DgroupId=org.bitbucket.hernandezblasantonio.jersey \
      -DartifactId=EjemploDeJersey
    
    [INFO] Scanning for projects...
    ...
    ...
    ...
    [INFO] ----------------------------------------------------------------------------
    [INFO] Using following parameters for creating project from Old (1.x) Archetype: jersey-quickstart-grizzly2:2.19
    [INFO] ----------------------------------------------------------------------------
    [INFO] Parameter: basedir, Value: /home/alumno/www/jersey
    [INFO] Parameter: package, Value: org.bitbucket.hernandezblasantonio.jersey
    [INFO] Parameter: groupId, Value: org.bitbucket.hernandezblasantonio.jersey
    [INFO] Parameter: artifactId, Value: EjemploDeJersey
    [INFO] Parameter: packageName, Value: org.bitbucket.hernandezblasantonio.jersey
    [INFO] Parameter: version, Value: 1.0-SNAPSHOT
    [INFO] project created from Old (1.x) Archetype in dir: /home/alumno/www/jersey/EjemploDeJersey
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 7.759s
    [INFO] Finished at: Sat Aug 01 23:41:15 CDT 2015
    [INFO] Final Memory: 10M/26M
    [INFO] ------------------------------------------------------------------------
    

    El comando es: mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false -DgroupId=org.bitbucket.hernandezblasantonio.jersey -DartifactId=EjemploDeJersey

    La estructura del proyecto generado por Maven sería:

    [alumno@servidor jersey]$ tree -fF
    .
    └── ./EjemploDeJersey/
        ├── ./EjemploDeJersey/pom.xml
        └── ./EjemploDeJersey/src/
            ├── ./EjemploDeJersey/src/main/
            │   └── ./EjemploDeJersey/src/main/java/
            │       └── ./EjemploDeJersey/src/main/java/org/
            │           └── ./EjemploDeJersey/src/main/java/org/bitbucket/
            │               └── ./EjemploDeJersey/src/main/java/org/bitbucket/hernandezblasantonio/
            │                   └── ./EjemploDeJersey/src/main/java/org/bitbucket/hernandezblasantonio/jersey/
            │                       ├── ./EjemploDeJersey/src/main/java/org/bitbucket/hernandezblasantonio/jersey/Main.java
            │                       └── ./EjemploDeJersey/src/main/java/org/bitbucket/hernandezblasantonio/jersey/MyResource.java
            └── ./EjemploDeJersey/src/test/
                └── ./EjemploDeJersey/src/test/java/
                    └── ./EjemploDeJersey/src/test/java/org/
                        └── ./EjemploDeJersey/src/test/java/org/bitbucket/
                            └── ./EjemploDeJersey/src/test/java/org/bitbucket/hernandezblasantonio/
                                └── ./EjemploDeJersey/src/test/java/org/bitbucket/hernandezblasantonio/jersey/
                                    └── ./EjemploDeJersey/src/test/java/org/bitbucket/hernandezblasantonio/jersey/MyResourceTest.java
    
    14 directories, 4 files
    
  4. Accede al directorio EjemploDeJersey y borra los archivos MyResource.java y MyResourceTest.java:

    [alumno@servidor jersey]$ cd EjemploDeJersey
    [alumno@servidor EjemploDeJersey] find . -iname "MyResource*.java" -exec rm {} \;
    
  5. Edita el archivo src/main/java/org/bitbucket/hernandezblasantonio/jersey/Main.java (el punto de inicio de tu "aplicación"):

    package org.bitbucket.hernandezblasantonio.jersey;
    
    import org.glassfish.grizzly.http.server.HttpServer;
    import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
    import org.glassfish.jersey.server.ResourceConfig;
    import java.io.IOException;
    import java.net.URI;
    
    public class Main {
        public static final String BASE_URI = "http://localhost:8080";
        public static HttpServer startServer() {
            final ResourceConfig rc = new ResourceConfig().
                packages("org.bitbucket.hernandezblasantonio.jersey").
                property("jersey.config.server.wadl.disableWadl", true);
            return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
        }
        public static void main(String[] args) throws IOException {
            final HttpServer server = startServer();
            System.out.println("\nJersey app listening at " + BASE_URI);
            System.out.println("Hit Enter to stop it...");
            System.in.read();
            server.stop();
        }
    }
    
  6. Edita el archivo pom.xml y agrega al elemento <dependencies> el siguiente elemento (dependencia):

    <dependency>
       <groupId>org.glassfish.jersey.media</groupId>
       <artifactId>jersey-media-moxy</artifactId>
    </dependency>
    
  7. Crea el archivo src/main/java/org/bitbucket/hernandezblasantonio/jersey/RecursoRaiz.java con el siguiente contenido:

    package org.bitbucket.hernandezblasantonio.jersey;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    @Path("/")
    public class RecursoRaiz {
        @GET
        @Produces(MediaType.APPLICATION_JSON)
        public String getMensaje() {
            return "{\"mensaje\": \"Hola mundo\"}";
        }
    }
    
  8. Compila tu aplicación:

    [alumno@servidor EjemploDeJersey]$ mvn compile
    [INFO] Scanning for projects...
    [INFO]                                                                         
    [INFO] ------------------------------------------------------------------------
    [INFO] Building EjemploDeJersey 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO] 
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ EjemploDeJersey ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory /home/alumno/www/jersey/EjemploDeJersey/src/main/resources
    [INFO] 
    [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ EjemploDeJersey ---
    [INFO] Compiling 2 source files to /home/alumno/www/jersey/EjemploDeJersey/target/classes
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1.309s
    [INFO] Finished at: Sun Aug 02 10:56:35 CDT 2015
    [INFO] Final Memory: 12M/30M
    [INFO] ------------------------------------------------------------------------
    
  9. Ejecuta tu aplicación:

    [alumno@servidor EjemploDeJersey]$ mvn exec:java
    [INFO] Scanning for projects...
    [INFO]                                                                         
    [INFO] ------------------------------------------------------------------------
    [INFO] Building EjemploDeJersey 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO] 
    [INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ EjemploDeJersey >>>
    [INFO] 
    [INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ EjemploDeJersey <<<
    [INFO] 
    [INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ EjemploDeJersey ---
    ago 02, 2015 10:58:48 AM org.glassfish.grizzly.http.server.NetworkListener start
    INFORMACIÓN: Started listener bound to [localhost:8080]
    ago 02, 2015 10:58:48 AM org.glassfish.grizzly.http.server.HttpServer start
    INFORMACIÓN: [HttpServer] Started.
    
    Jersey app listening at http://localhost:8080
    Hit Enter to stop it...
    
  10. Con un cliente REST accede a http://localhost:8080

    images/jersey.png

Lecturas sobre Jersey

Spark

  1. Verifica la disponibilidad de Java y Maven:

    [alumno@servidor ~]$ which java
    /usr/lib/java/bin/java
    [alumno@servidor ~]$ which mvn
    /usr/bin/mvn
    [alumno@servidor ~]$ java -version
    java version "1.8.0_51"
    Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
    Java HotSpot(TM) Client VM (build 25.51-b03, mixed mode)
    [alumno@servidor ~]$ mvn -version
    Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 10:22:22-0500)
    Maven home: /usr/share/maven
    Java version: 1.8.0_51, vendor: Oracle Corporation
    Java home: /usr/lib/java/jre
    Default locale: es_MX, platform encoding: UTF-8
    OS name: "linux", version: "3.10.17-smp", arch: "i386", family: "unix"
    
  2. Crea el directorio donde residirá tu proyecto (jersey) y accede a él:

    [alumno@servidor ~]$ mkdir -p /home/alumno/www/spark
    [alumno@servidor ~]$ cd /home/alumno/www/spark/
    
  3. Crea la estructura del proyecto para Spark mediante Maven, haciendo uso de Jetty como provedor del servicio de HTTP ("servidor HTTP"):

    alumno@servidor spark]$ mvn archetype:generate \
     -DarchetypeArtifactId=maven-archetype-quickstart \
     -DinteractiveMode=false \
     -DgroupId=org.bitbucket.hernandezblasantonio.spark \
     -DartifactId=EjemploDeSpark
    
    [INFO] Scanning for projects...
    ...
    ...
    ...
    [INFO] ----------------------------------------------------------------------------
    [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
    [INFO] ----------------------------------------------------------------------------
    [INFO] Parameter: basedir, Value: /home/alumno/www/spark
    [INFO] Parameter: package, Value: org.bitbucket.hernandezblasantonio.spark
    [INFO] Parameter: groupId, Value: org.bitbucket.hernandezblasantonio.spark
    [INFO] Parameter: artifactId, Value: EjemploDeSpark
    [INFO] Parameter: packageName, Value: org.bitbucket.hernandezblasantonio.spark
    [INFO] Parameter: version, Value: 1.0-SNAPSHOT
    [INFO] project created from Old (1.x) Archetype in dir: /home/alumno/www/spark/EjemploDeSpark
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 8.112s
    [INFO] Finished at: Sun Aug 02 19:08:07 CDT 2015
    [INFO] Final Memory: 10M/26M
    [INFO] ------------------------------------------------------------------------
    

    El comando es: mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DgroupId=org.bitbucket.hernandezblasantonio.spark -DartifactId=EjemploDeSpark

    La estructura del proyecto generado por Maven sería:

    [alumno@servidor spark]$ tree -fF
    .
    └── ./EjemploDeSpark/
        ├── ./EjemploDeSpark/pom.xml
        └── ./EjemploDeSpark/src/
            ├── ./EjemploDeSpark/src/main/
            │   └── ./EjemploDeSpark/src/main/java/
            │       └── ./EjemploDeSpark/src/main/java/org/
            │           └── ./EjemploDeSpark/src/main/java/org/bitbucket/
            │               └── ./EjemploDeSpark/src/main/java/org/bitbucket/hernandezblasantonio/
            │                   └── ./EjemploDeSpark/src/main/java/org/bitbucket/hernandezblasantonio/spark/
            │                       └── ./EjemploDeSpark/src/main/java/org/bitbucket/hernandezblasantonio/spark/App.java
            └── ./EjemploDeSpark/src/test/
                └── ./EjemploDeSpark/src/test/java/
                    └── ./EjemploDeSpark/src/test/java/org/
                        └── ./EjemploDeSpark/src/test/java/org/bitbucket/
                            └── ./EjemploDeSpark/src/test/java/org/bitbucket/hernandezblasantonio/
                                └── ./EjemploDeSpark/src/test/java/org/bitbucket/hernandezblasantonio/spark/
                                    └── ./EjemploDeSpark/src/test/java/org/bitbucket/hernandezblasantonio/spark/AppTest.java
    
    14 directories, 3 files
    
  4. Accede al directorio EjemploDeSpark y borra los archivos con extensión java:

    [alumno@servidor spark]$ cd EjemploDeSpark
    [alumno@servidor EjemploDeSpark] find . -iname "*.java" -exec rm {} \;
    
  5. Crea el archivo src/main/java/org/bitbucket/hernandezblasantonio/spark/Main.java (el punto de inicio de tu "aplicación") con el siguiente contenido:

    package org.bitbucket.hernandezblasantonio.spark;
    
    import static spark.Spark.*;
    
    public class Main {
        public static void main(String[] args) {
            port(8080);
            get("/", (request, response) -> {
                response.status(200);
                response.type("application/json");
                return "{\"mensaje\": \"Hola mundo\"}";
            });
        }
    }
    
  6. Edita el archivo pom.xml:

    • Agrega al elemento <dependencies> el siguiente elemento (dependencia):

      <dependency>
            <groupId>com.sparkjava</groupId>
            <artifactId>spark-core</artifactId>
            <version>2.2</version>
      </dependency>
      
    • Agrega al elemento <project> el siguiente elemento (build):

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
              <encoding>UTF-8</encoding>
            </configuration>
          </plugin>
        </plugins>
      </build>
      
  7. Compila tu aplicación:

    [alumno@servidor EjemploDeSpark]$ mvn compile
    [INFO] Scanning for projects...
    [INFO]                                                                         
    [INFO] ------------------------------------------------------------------------
    [INFO] Building EjemploDeSpark 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO] 
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ EjemploDeSpark ---
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /home/alumno/www/spark/EjemploDeSpark/src/main/resources
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.3:compile (default-compile) @ EjemploDeSpark ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to /home/alumno/www/spark/EjemploDeSpark/target/classes
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1.090s
    [INFO] Finished at: Sun Aug 02 18:12:47 CDT 2015
    [INFO] Final Memory: 11M/26M
    [INFO] ------------------------------------------------------------------------
    
  8. Ejecuta tu aplicación:

    [alumno@servidor EjemploDeSpark]$ mvn exec:java -Dexec.mainClass=org.bitbucket.hernandezblasantonio.spark.Main
    [INFO] Scanning for projects...
    [INFO]                                                                         
    [INFO] ------------------------------------------------------------------------
    [INFO] Building EjemploDeSpark 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO] 
    [INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @ EjemploDeSpark ---
    [Thread-1] INFO spark.webserver.SparkServer - == Spark has ignited ...
    [Thread-1] INFO spark.webserver.SparkServer - >> Listening on 0.0.0.0:8080
    [Thread-1] INFO org.eclipse.jetty.server.Server - jetty-9.0.2.v20130417
    [Thread-1] INFO org.eclipse.jetty.server.ServerConnector - Started ServerConnector@167d9f5{HTTP/1.1}{0.0.0.0:8080}
    
  9. Con un cliente REST accede a http://localhost:8080

    images/spark.png

Lecturas sobre Spark

Lecturas