developer productivity with forge, java ee 6 and arquillian
DESCRIPTION
Presentation given at JavaOne Tokyo 2012 about the innovations in Java EE 6, JBoss Forge, Arquillian.TRANSCRIPT
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