Developer Productivity with Forge, Java EE 6 and Arquillian

Preview:

DESCRIPTION

Presentation given at JavaOne Tokyo 2012 about the innovations in Java EE 6, JBoss Forge, Arquillian.

Citation preview

Using JBoss Forge, Arquill ian & Java EE 6

RAPID JAVA APPLICATION

DEVELOPMENT

Ray Ploski Director, Developer Programs & Strategy

JBoss, by Red Hat, Inc.

? DEVELOPER PRODUCTIVITY

- WHAT IF?

Faster Start-Up Times

Easier Integration Testing

80% Less Configuration

50% Less Code

25% Less Classes

Rapid Application Tooling

Vendor Agnostic

Open eco-system

* Based on a Sample POJO/JPA/REST Based Application

GREAT !!!

J2EE

EJB

#fail #fail

#fail

PURPOSE OF THIS TALK ¡  Demonstrate productivity gains §  Less Code, Classes and Configuration

¡  Address Concerns §  About Java EE, EJBs, App Servers & Lock-in

¡  Introduce new innovations §  JBoss Forge §  CDI and Apache DeltaSpike §  Arquillian

J2EE 1.4

EJB 2.X SESSION BEAN

EJB 2.X DEPLOYMENT DESCRIPTOR

<!-- … à!<enterprise-beans>! <session>! <display-name>BankSB</display-name>! <ejb-name>BankBean</ejb-name>! <local-home>com.advocacy.legacy.ejb.BankLocalHome</local-home>! <local>com.advocacy.legacy.ejb.BankLocal</local>! <ejb-class>com.advocacy.legacy.ejb.BankBean</ejb-class>! <session-type>Stateless</session-type>! <transaction-type>Container</transaction-type>! </session>!</enterprise-beans>!<assembly-descriptor>! <container-transaction>! <method>! <ejb-name>BankSB</ejb-name>! <method-name>*</method-name>! </container-transaction>!</assembly-descriptor>!

EJB 2.X CLIENT VIEW

try {!! Context ctx = new InitialContext();! BankLocalHome home = (BankLocalHome)

!ctx.lookup(“java:comp/env/ejb/bank”);! BankLocal bank = home.create();! bank.deposit(2500.00, new Account(12345)); !} catch (Exception ex) {!! // …!}!

J2EE

EJB

#fail #fail

#fail

? DEVELOPER PRODUCTIVITY

WHAT IF?

Faster Start-Up Times

Easier Integration Testing

80% Less Configuration

50% Less Code

25% Less Classes

Rapid Application Tooling

Vendor Agnostic

Open eco-system

* Based on a Sample POJO/JPA/REST Based Application

¡ Resource injection in JEE5 § @EJB, @Resource, @PersistenceContext, § @PersistenceUnit

¡ Into Container Components: § Servlets, JSF backing beans and other EJBs

¡ Progress but still Problems § No POJOs § Cannot inject DAOs or helper classes that were not written as

EJBs § Hard to integrate anything but strictly business components

JAVA EE 5

Java EE 6

EJB 3.1 SESSION BEAN O

PTION

AL!

JAVA EE 6 DEPLOYMENT DESCRIPTOR

EJB 3.1 CLIENT VIEW

@EJB BankLocal bank;!!public void makeDeposit() !{! bank.deposit(2500.00, new Account(12345));!}!

¡ Configuration by exception with sensible defaults §  Security permissions defaults to UNCHECKED §  Transaction type defaults to CONTAINER §  Transaction attribute defaults to REQUIRED

¡ Use Annotations §  To choose explicitly (recommended) §  To override defaults

¡ Deployment descriptor is no longer required §  But can override above configurations

HOW DID THEY DO THAT?

¡  Optional Local Interface ¡  Simplified Packaging ¡  EJB-Lite ¡  Portable JNDI Naming ¡  Simple Component Testing

EASE-OF-USE IMPROVEMENTS

Loose Coupling

STRONG TYPING

DI (@Inject) JSR 330 javax.inject! @Inject!@Named!@Singleton!@Qualifier!@Scope!

CDI JSR 299 javax.enterprise.context!!

Alternatives!Producers!Scopes!Stereotypes!Decorators!Extensions!

DEPENDENCY INJECTION IN TWO PARTS

INJECTION 101

public class StatusUpdater {!! @Inject! private UrlShortener shortener;!! public void post (String username, String status) {! !String sStatus = shortener.shortenUrls(status);!

!System.out.println(username + “ said “ + sStatus);! }!!}! !

WH

AT MA

KES

CD

I UN

IQU

E?

STANDARD TYPE SAFE

EXTENSIBLE

QUALIFIED INJECTION OF RESOURCES

@Path(“/items”) @ManagedBean!public class ItemRestService {!! @Inject @NumberOfDigits(Digits.EIGHT)! private NumberGenerator numberGenerator;! …!}!!!@WebServlet(urlPatterns = “/itemServlet”)!public class ItemServlet extends HttpServlet {!! @Inject @NumberOfDigits(Digits.THIRTEEN)! private NumberGenerator numberGenerator;! …!}!

Strong Typing No Strings

Loose Coupling No Reference to Implementation

DEFINING THE QUALIFIER

!@Qualifier!@Retention(RUNTIME)!@Target({FIELD, TYPE, METHOD, PARAMETER})!public @interface NumberOfDigits {!!

!Digits value();!!}!!public enum Digits {!

!TWO, EIGHT, TEN, THIRTEEN!!}!!

DEFINING THE BEANS @NumberOfDigits(Digits.EIGHT)!public class IssnGenerator implements NumberGenerator {!! public String generateNumber() {! return “8-” + nextNumber();! }!! // …!}!!@NumberOfDigits(Digits.THIRTEEN)!public class IsbnGenerator implements NumberGenerator {!! public String generateNumber() {! return “13-84356-” + nextNumber();! }!! // …!}!

CDI - EXTENSIBLE BY DESIGN

¡ Many community projects of extensions: § Seam 3, CODI, Cambridge Technology Partners

¡ These multiple projects merging to deliver a vendor-neutral open ecosystem for extensions

named DeltaSpike.

¡  Hosted on Apache. Works on all Java EE 6 servers

CDISource+ + DeltaSpike

Servlet Container

(After lots of tweaking)

Java EE6 vs.

? DEVELOPER PRODUCTIVITY

- WHAT IF?

Faster Start-Up Times

Easier Integration Testing

80% Less Configuration

50% Less Code

25% Less Classes

Rapid Application Tooling

Vendor Agnostic

Open eco-system

* Based on a Sample POJO/JPA/REST Based Application

¡  Startup Times w/ an Application Deployed

§  JBoss AS 7.10 ~ 2 seconds §  GlassFish v3 ~ 4 seconds §  Tomcat 6 + Spring ~ 4 seconds § Java EE 6 War File < 100kb

ISN’T JAVA EE TOO SLOW & FAT?

MEMORY COMPARISON

JAVA EE 5

JAVA EE 6

JAVA EE 6 SPECIFICATION

No Where in the Specification does it

mention that App Servers must be slow

and complex.

? DEVELOPER PRODUCTIVITY

- WHAT IF?

Faster Start-Up Times

Easier Integration Testing

80% Less Configuration

50% Less Code

25% Less Classes

Rapid Application Tooling

Vendor Agnostic

Open eco-system

* Based on a Sample POJO/JPA/REST Based Application

Start up Costs Gotchas Integration Details

I need one of those widgets for

a marketing meeting in an

hour.

TYPIC

AL D

EVELOP

ER

NIG

HTM

AR

E

CARVE OUT A PROJECT WORK IT INTO SHAPE

Let’s get started

JAVA EE IN MINUTES

FORGE LEVERAGES FACETS & PLUGINS

Project

Java Facet Web Facet X Facet

Plugin A Plugin B Plugin X...

Demonstration of Forge and Java EE Application

GETS YOU STARTED QUICKLY

HANDLES “GOTCHAS”

ADDS & ACTIVATES

TECH VIA

PLUGINS

Handles details, gives you perspective … and time

TESTING JAVA EE USED TO BE DIFFICULT

MANY STEPS REQUIRED FOR MODIFYING CODE PRODUCTIVELY

ARQUILLIAN REMOVES THE STEPS

ARQUILLIAN

ARQUILLIAN REMOVES THE STEPS

SEE MORE AT コンテナでテストをまわせ!

A powerful programming model.

Less code, greater portability.

Optimized for productivity & automation.

CDI and Forge plugins.

Absolutely. You saw it first hand.

REFERENCES

¡  Max Andersen §  “See Context & Dependency Injection from Java EE 6 in

Action” §  http://www.slideshare.net/maxandersen/see-context-

dependency-injection-from-java-ee-6-in-action

¡  Pete Muir §  “CDI in Action”

¡ Andrew Lee Rubinger §  “The Death of Slow” §  http://www.slideshare.net/ALRubinger/devoxx-2011-

jboss-as7-death-of-the-slow

¡ Bert Ertman §  EJB 3.1 §  http://www.slideshare.net/stephanj/ejb-31-by-bert-

ertman

¡  Antonio Goncalves §  “To inject or not to inject: CDI is the question” §  http://www.slideshare.net/agoncal/to-inject-or-not-to-inject-cdi-is-the-

question

Recommended