Java
Jersey
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"
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/
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
Accede al directorio
EjemploDeJersey
y borra los archivosMyResource.java
yMyResourceTest.java
:[alumno@servidor jersey]$ cd EjemploDeJersey [alumno@servidor EjemploDeJersey] find . -iname "MyResource*.java" -exec rm {} \;
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(); } }
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>
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\"}"; } }
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] ------------------------------------------------------------------------
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...
Con un cliente REST accede a http://localhost:8080
Lecturas sobre Jersey
- Servicios REST con Eclipse y JAX-RS [PDF]
- Proyecto en Eclipse con Jersey(JAX-RS 2.0)+Tomcat+JSON
- Servicios Web RestFul empleando Eclipse, el framework Jersey y desplegado en Apache Tomcat
Spark
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"
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/
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
Accede al directorio
EjemploDeSpark
y borra los archivos con extensiónjava
:[alumno@servidor spark]$ cd EjemploDeSpark [alumno@servidor EjemploDeSpark] find . -iname "*.java" -exec rm {} \;
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\"}"; }); } }
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>
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] ------------------------------------------------------------------------
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}
Con un cliente REST accede a http://localhost:8080
Lecturas sobre Spark
- Java Web Development – ¿Alguna novedad?
- Spark: Framework ligero en Java
- Crear un proyecto Maven en Eclipse para utilizar el framework web de Java "SPARK"
- Aclaraciones:
- No confundir los proyectos Spark Framework (a tiny Sinatra inspired framework for creating web applications in Java 8 with minimal effort), Apache Spark (a fast and general engine for large-scale data processing ) y Spark (an Open Source, cross-platform IM client optimized for businesses and organizations).
- Las versiones más recientes de Spark Framework (>= 2.0) requieren de Java 8 por el uso de
lambdas:
- Expresiones lambda en Java 8
- Java 8: más allá de los lambdas
- Programación Funcional en Java 8 (vídeo-presentación)
Lecturas
- ¿Qué es Maven?, del mismo autor en su página web.
- Automatización y administración de dependencias Java con Maven
- Maven