Hello Gradle JEE, Git, Gradle, TestNG, Eclipse, IntelliJ IDEA Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 1 Bedők Dávid 2016.09.20. v1.2
Információ Hivatalos tárgyi weboldal: http://users.nik.uni-obuda.hu/bedok.david/jee.html ● Prezentációk (vmajor.minor + yyyy.mm.dd.) ● Programok, eszközök, library-k E-mail:
[email protected] Forráskódok: https://github.com/davidbedok/oejee Előkövetelmény: ● ● ● ● ● ● ●
Java SE alapos ismeret ANSI SQL és adatbáziskezelés alapfokú ismerete XML, XHTML ismeret Java Servlet és JSP alapfokú ismeret Open-source szemlélel Java ecosystemre való nyitottság GIT verziókezelő használata (?)
2
Követelmény ● Laborfoglalkozások: 2 fős pármunkában (XP), előadások és konzultáció ● Önálló projekt munka elkészítése a tanult technológiák felhasználásával ○ 3. hét: Terv leadása PDF formátumban (max. 2 oldal) ○ 3. hét-13. hét: Projekt folyamatos fejlesztése (git history) ○ 13. hét: Projekt fejlesztésének befejezése ○ 13-14. hét: Projekt bemutatása (10-15 perces élő demo, max. 5 perc prezentáció) ○ 14. hét: Projekt fejlesztési dokumentáció leadása (15-20 oldal PDF formátumban) ○ Pótleadás: Ha sokminden hiányzik, akkor esélytelen, egyéb esetben egyedi elbírálás alapján. ■ Dokumentáció pótleadás lehetséges vizsgaidőszakban gyakorlati jegy póton ● Elméleti teszt zárthelyi bejelentés nélkül elképzelhető ○ átlag muszáj >= 2 ○ Zárthelyik javítása lehetséges a 14. héten (átlagot lehet javítani) 3 ○ Zárthelyik teljes pótlása lehetséges gyakorlati jegy póton
Féléves feladat Téma követelmények Egy valóságban is létező problématérre épülő alkalmazás készítése, melyben definiálható a téma körül értelmezett adat- és a rajtuk végzett művelethalmaz. Az alkalmazásnak több “interface”-e kell hogy legyen: 1. Webes interface (3-5 JSP/JS dinamikus weboldal) 2. REST API (CRUD műveletek, akciók végrehajtása) 3. Queue/Topic interface pl. batch adatfeltöltésre, aszinkron művletvégzésre <3 db interface: sikertelen projekt 4. Management felület (JMX) 3 db interface: maximum 3-es érdemjegy 5. SOAP WebService 4 db interface: maximum 4-es érdemjegy >4 db interface: akár 5-ös érdemjegy 6. Remote EJB (RMI) Az interface-ekhez ha szükséges, kliens programokat is kell készíteni (Java/C#/stb.), vagy konfigurációt kell adni (pl. SOAP UI).
4
Félvés feladat Adatbázis követelmények A választott téma kapcsán egy olyan ~ANSI SQL db schema kialakítása, mely az alábbi komplexitásokat tartalmazza: ● Legalább 6 adatbázis tábla, kb. 25 mező ● Min. 1 db 1-N kapcsolat egy tábla és egy törzstábla között (a törzstáblából enum lesz entitás helyett) ● Min. 1 db 1-N kapcsolat két tábla között ● Min. 1 db N-M kapcsolat kapcsolótáblával ● Egyéni komplexitás (pl. partnerlekérdezéses tábla, topológia, stb.) ● Legalább 2 db unique index és legalább 2 normal index ● Léterhozó és takarító postgresql scriptek (minta alapján) ● Saját schema, user, role (minta alapján) Az adatbázis schemára számos kész és működő minta script halmaz található a tárgy git repository-jában, így a fenti követelmény kizárólag a kreativitást írja elő, a “szakmai munka” része gyakorlatilag készen van (interpretálni kell csak).
5
Project Git Repository A féléves feladatokkal folyamatos fejlesztés mellett az alábbi git repository-ban kell dolgozni: https://github.com/davidbedok/oejee2016autumn ● Ha még nincs GitHub account, létre kell egyet hozni ● A GitHub account és a diák egyértelmű összekötése a project.json állományban lesz (repository gyökerében). Ennek karbantartása a hallgatók feladata! ● Válasszon mindenki egy üzleti igényt/témát, illetve projekt nevet! ● project.json állományt kell kitölteni 6
Project állomány {
project.json "period": "2016-2017/1", "projects": [ A git repository-ban törekedjünk { "name": "sample", mindenhol az angol nyelv "description": "Sample project", használatára. "platform": "weblogic", "members": [ A project neve (name element) { "name": "Dávid Bedők", kisbetűs, angol, white space "neptun": "Q59R7A", mentes egyértelmű és egyedi "github": "davidbedok" kifejezés legyen a repo-ra nézve. } A project nevének megfelelő ], könyvtár létezzen a /projects "interfaces": [ könyvtárban alkönyvtárként. Ez { "tpye": "restful", legyen a saját projekt gradle "goal": "handle crud operations" root-ja. }, { "type": "jms", A members tömb elemei "goal": "bulk upload data" hozzák létre a kapcsolatot a } hallgató nevével, neptun ] kódjával és githu platform: [weblogic|jms] } felhasználója nevével. ] interface type: [web|rest|jms|jmx|soap|rmi]
}
7
Java Enterprise Edition - Történet ● 1998 - Java Professional Edition ● 1999 - J2EE 1.2 (Java 2 Platform, Java SE 1.2+) ● 2001 - J2EE 1.3 (Java SE 1.3+) ● 2003 - J2EE 1.4 (Java SE 1.4+) ● 2006 - JEE 5 (Java SE 5+) ● 2009 - JEE 6 (Java SE 6+) ● 2013 - JEE 7 (Java SE 7+) ● ~2017 - JEE 8 (Java SE 8+) JRE verziószáma 1.4 után: 5, 6, 7, 8, .. JDK verziószáma még sok helyen: 1.5.0, 1.6.0, 1.7.0, .. JRE 8.x és JDK 1.8.x már official, JEE 8 még készülőben
8
Java Enterprise Edition - Elemei Java Community Process’s JSR (Java Specification Request) ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
JDBC - Java Database Connectivity [JSR54, JSR114, JSR221] RMI-IIOP - Java Remote Method Invocation over Internet Inter-Orb Protocol JNDI - Java Naming and Directory Interface Specification Java Servlet [JSR154, JSR315, JSR340] JSP - JavaServer Pages [JSR152, JSR245] JSTL - JavaServer Pages Standard Tag Library [JSR52] EJB - Enterprise JavaBeans [JSR153, JSR220, JSR318, JSR345] JMS - Java Message Service [JSR914, JSR343] JTA - Java Transaction API [JSR907] JCA - J2EE Connector Architecture [JSR112, JSR322] JAAS - Java Authentication and Authorization Service JSF - JavaServer Faces [JSR127, JSR252, JSR314, JSR344] JMX - Java Management Extensions [JSR3, JSR160, JSR255, JSR262] JAX-WS - Java API for XML-Based Web Services [JSR224] JAX-RS - Java API for RESTful Web Services [JSR311, JSR339] JAXP - Java API for XML Processing [JSR206] JAXB - Java Architecture for XML Binding [JSR222] JPA - Java Persistence API [JSR220, JSR317, JSR338] SAAJ - SOAP with Attachments API for Java [JSR67] EL - Expression Language [JSR245, JSR341] CDI - Contexts and Dependency Injection [JSR299, JSR346] Interceptors [JSR318] ...
9
JEE és Elemeinek verziói Content
J2EE 1.2
J2EE 1.3
J2EE 1.4
JEE 5
JEE 6
JEE 7
JDBC
2.0
2.0
3.0
3.0
4.0
4.1
JNDI
1.2
1.2
1.2
1.2
1.2
1.2
RMI-IIOP
1.1
1.1
1.1
1.1
1.1
1.1
Java Servlet
2.2
2.3
2.4
2.5
3.0
3.1
JSP
1.1
1.2
2.0
2.1
2.2
2.3
EJB
1.1
2.0
2.1
3.0
3.1
3.2
JMS
1.0
1.0
1.1
1.1
1.1
2.0
JTA
1.0
1.0
1.0
1.1
1.1
1.2
JAXP
-
1.1
1.2
1.3
1.3
1.3
JSTL
-
1.0
1.1
1.2
1.2
1.2
JCA
-
1.0
1.5
1.5
1.6
1.7
JAAS
-
1.0
1.3
1.3
1.3
1.3
JSF
-
-
1.1
1.2
2.0
2.2
JMX
-
-
1.2
1.2
1.2
2.0
JAX-WS
-
-
-
2.0
2.2
2.2
JAXB
-
-
-
2.0
2.2
2.2
SAAJ
-
-
-
1.3
1.3
1.3
JPA
-
-
-
1.0
2.0
2.1
JAX-RS
-
-
-
-
1.1
2.0
EL
-
-
-
-
2.2
3.0
CDI
-
-
-
-
1.0
1.1
Interceptors
-
-
-
-
1.1
1.2
10
Java fejlesztői környezet ●
Java ○
●
Verziókezelő ○
●
Active MQ, HornetQ, …
Riport ○
●
PostgreSQL, MySQL, Redis, Derby (JavaDB), …
Messaging Framework ○
●
Selenium, jUnit, TestNG, SoapUI, …
Adattárolás ○
●
Apache Tomcat, JBoss, Glassfish, WebLogic, ...
Teszt eszközök, library-k ○
●
Eclipse, IntelliJ IDEA, Netbeans
(Enterprise) Application Server (EAS/AS) ○
●
Gradle, Maven, Ant, scripts, ...
Integrated Development Environment (IDE) + plugins ○
●
Git, Mercury, SVN, …
Build tool ○
●
Oracle Java JDK, Open JDK, ...
Jasper Reports, …
Continuous Integration (CI) támogatása ○
Codestyle, static checks, ...
11
Java SE JDK http://www.oracle.com/technetwork/java/javas e/downloads/index.html ● Java SE 7u79 ● Java SE 8u102 (javasolt) System Environment Variable: ● JAVA_HOME, j:\java\jdk1.8.0_102 ● Path módosítása: %Path%;%JAVA_HOME%\bin >java -version java version "1.8.0_102" Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
12
Git Source Code Management ● ● ● ● ●
Nyílt forráskódú elosztott verziókezelő Linus Torvalds >git --version Verzió: 2.10.0 git version 2.8.1.windows.1 https://git-scm.com/ Install (windows installer) ○ Use Git from the Windows Command Prompt ○ Use OpenSSH ○ Checkout Windows-style, commit Unix-style line endings ○ Use MinTTY ○ Disable file system caching 13
GitHub ● Public repository-k számára ingyenes. ● Elsősorban open-source társaságok számára. Üzleti érdekszférába tartozó projektek esetén a public repository később kellemetlenséget okozhat!
● https://github.com/ ● Sign UP! ● https://github.com/davidbedok BitBucket (https://bitbucket.org/): ● Private repository-k számára is ingyenes 5 fejlesztőig
14
OEJEE Repository https://github.com/davidbedok/oejee.git
>git clone https://github.com/davidbedok/oejee.git Cloning into 'oejee'... remote: Counting objects: 4, done. remote: Compressing objects: 100% (3/3), done. remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (4/4), done. Checking connectivity... done. 15
Java project struktúra Avagy hogyan szervezzük forrásainkat? 1. 2. 3.
javac Eclipse Gradle
Java 1. 2. 3. 4.
Build eszközök: batch filok / bash scriptek (javac, stb.) Apache ANT (+ Apache IVY) Apache Maven Gradle
Miket érdemes figyelembe venni? ●
● ●
Lesznek egység tesztjeink? ○ külön Source folder a teszteknek (test vs main) ○ tipikusan külön szint a könyvtárstruktúrában JAR Hell probléma, Lesznek erőforrásaink? MANIFEST.MF file ○ külön könyvtárak használata (resources) Lesznek nem java forrásaink is? ○ tipikusan külön szint a könyvtárstruktúrában (java, groovy, scala, ...)
Java filozófia ● ● ●
Átláthatóság, egyértelműség Classpath (cp) használata JAR, WAR, EAR, SAR*, APK** csomagolások alkalmazása
*: jboss specifikus (nem scope)
**: android specifikus (nem scope)
16
Java projekt struktúra - javac Elvben teljesen önkéntes! javac programnak megadjuk az összes olyan könyvtárat, ahol forrásállományok találhatóak. GIT
\hellotest
bin/ src1/ src2/
Source folder Source folder
>javac -d ./bin ./src1/hu/qwaevisz/demo/Application.java ./src2/hu/qwaevisz/demo/ImperialToMetricCalculator.java >java -cp ./bin hu.qwaevisz.demo.Application Az Application osztály használja az ImperialToMetricCalculator osztály egy példányát. Mindkettő azonos csomagba fordul, ezért az alkalmazás nem importálja a kalkulátort, futás időben egy helyen lesznek.
17
Java projekt struktúra - Eclipse ● Eclipse “Java project” default konfigurációja: bin/ src/
Source folder
● Eclipse “Java project” egység tesztekkel: bin/ src/ main/ src/ test/
Source folder
Source folder
A legtöbb IDE-ben ezek teljeskörűen konfigurálható elemek! 18
Java projekt struktúra - Gradle ● Gradle “java” plugin default konfigurációja: build/ src/ main/ java/ resources/ src/ test/ java/ resources/
Source folder Source folder
Source folder Source folder
Ezektől Gradle-ben is teljes körűen el lehet térni, de nem érdemes. Ha élünk ezzel, akkor minimál konfigurációval el tudjuk kezdeni a munkát! Megjegyzés: mind a source, mind a resources könyvtárak rajta vannak a classpath-on. 19
JAR - Java ARchive META-INF/ MANIFEST.MF hu/ qwaevisz/ demo/ HelloWorld.class Lorem.class log4j.xml
ZIP formátum, mely (Java) byte code-okat (*.class), konfigurációs állományokat (pl. *.properties, *.xml, stb.) illetve egy speciális metaadatokat (kulcs-érték párokat) tartalmazó MANIFEST.MF file-t tartalmaz. Struktúrája előre definiált, opcionálisan forrásállományokat (pl. *.java, *.groovy, stb.) is magával hordoz (azonos helyen a byte code-dal). MANIFEST.MF
Manifest-Version: 1.0 Created-By: 1.7.0_67 (Oracle Corporation) 20
(Executable) JAR file MANIFEST.MF Manifest-Version: 1.0 Created-By: 1.7.0_67 (Oracle Corporation) Main-Class: hu.qwaevisz.demo.Application
A Main-Class kulcsnak szerepelnie kell a MANIFEST.MF file-ban, és a belépési pontként szolgáló osztály full qualified neve az értéke.
>cd bin >jar cvfe calculator.jar hu.qwaevisz.demo.Application hu/qwaevisz/demo/Application.class hu/qwaevisz/demo/ImperialToMetricCalculator.class >cd .. >java -jar bin/calculator.jar
create new archive verbose specify archive file name (2. arg.) sepcify entry point (main class) (3. arg)
21
Gradle https://gradle.org/ Verzió: 3.0 From command line to IDE to continuous integration, only one Enterprise build automation system to rule them all. Declare and execute all tasks necessary to compile, test, package and ship multi-language multi-platform multi-project and multi-channel software, SaaS and Mobile Apps. (SaaS: Software as a Service) ● Install (unzip) System Environment Variable: ● GRADLE_HOME, c:\apps\gradle-2.6 ● Path módosítása: %PATH%;%GRADLE_HOME%\bin
22
Gradle ● ● ● ● ●
Groovy-based Ant dependency management style of Ivy the intelligent defaults of Maven the speed and hashing of Git the metaprogramming power of Groovy
Directed Acyclic Graph (DAG)
23
Gradle > gradle --version -----------------------------------------------------------Gradle 2.13 -----------------------------------------------------------Build time:
2016-04-25 04:10:10 UTC
Build number: none Revision:
3b427b1481e46232107303c90be7b05079b05b1c
Groovy:
2.4.4
Ant:
Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:
1.8.0_92 (Oracle Corporation 25.92-b14)
OS:
Windows 7 6.1 amd64 24
Gradle - Eclipse integráció ● Gradle “eclipse” plugin-ja legyártja az összes szükséges config állományt ahhoz, hogy eclipse project lehessen (semmi extra nincs ebben). ● Eclipse “Gradle” pluginja felismeri a gradle konfigurációs állományait, és annak megfelelően képes kezelni a projektet. ● A kettő együttes alkalmazása (legtöbbször) kényelmes, kompromisszummentes és professzionális megoldást ad. 25
Hello Gradle! Standalone Hello World with Gradle GIT
\oejee\helloworld
apply plugin: 'java'
[root] helloworld build.gradle
>gradle clean build
build/libs/helloworld.jar
non-executable!
clean, build → ‘java’ plugin task-jai build függőségei (taskok): compileJava, .., jar, assemble, test, check
26
Saját Gradle task apply plugin: 'java'
[root] helloworld
sourceCompatibility = 1.7 version = '1.0' task info() println println println }
{ "Task name: " + name "Project name: " + project.name "Project version: " + version build.gradle
>gradle info Task name: info Project name: helloworld Project version: 1.0 :info UP-TO-DATE BUILD SUCCESSFUL Total time: 4.34 secs 27
Executable JAR (jar task módosítása) [..]
[root] helloworld
jar { manifest { attributes 'Implementation-Title': 'Gradle Demo Application', 'Implementation-Version': version, 'Main-Class': ' hu.qwaevisz.gradle.Application' } } task run( type: Exec ) { workingDir 'build/libs' commandLine 'java', '-jar', "${project.name}-${version}.jar" }
build.gradle
>gradle clean build run 28
TestNG ● ● ● ●
http://testng.org/ GitHub: https://github.com/cbeust/testng Verzió: 6.9.10 Artifactory URL: ○ 'org.testng:testng:6.9.10' ○ group: 'org.testng', name: 'testng', version: '6.9.10'
29
Egység teszt készítése TestNG-vel src\test\java\hu\qwaevisz\gradle\ApplicationTest.java ApplicationTest.java package hu.qwaevisz.gradle; import org.testng.Assert; import org.testng.annotations.Test; public class ApplicationTest { @Test public void addNumbers() { Application app = new Application(); Assert.assertEquals(app.add(2, 3), 5); } }
30
Gradle és TestNG integráció [root] helloworld [..] def testngVersion = '6.9.10' repositories { mavenCentral() } dependencies { testCompile group: 'org.testng', name: 'testng' , version: testngVersion }
testCompile → test task (java plugin) konfigurációja (dependency configurations)
test { useTestNG()
default test framework: junit
} build.gradle
>gradle test
31
Gradle Tasks Java plugin
https://docs.gradle.org/current/userguide/ja va_plugin.html#tab:configurations compileJava, compileTestJava, jar, javadoc, test, clean, assemble, check, build, ...
32
Gradle Dependency Configurations Java plugin ●
compile ○
●
runtime ○
●
The dependencies required by the production classes at runtime. By default, also includes the compile time dependencies.
testCompile ○
●
The dependencies required to compile the production source of the project.
The dependencies required to compile the test source of the project. By default, also includes the compiled production classes and the compile time dependencies.
testRuntime ○
The dependencies required to run the tests. By default, also includes the compile, runtime and test compile dependencies.
33
Gradle és Eclipse integráció [root] helloworld
[..] apply plugin: 'eclipse' [..] build.gradle
>gradle eclipse
eclipseClasspath, eclipseJdt, eclipseProject tasks
settings/ org.eclipse.jdt.core.prefs .classpath új állományok jönnek létre .project 34
Eclipse Neon 4.6.0 ● ● ● ●
http://www.eclipse.org/downloads/ Eclipse IDE for Java EE Developers Install (unzip, eclipse-jee-neon-R-win32-x86_64) Install plugins (Help/Eclipse Marketplace) ○ TestNG (testng): ■
http://beust.com/eclipse
○ Code Coverage (eclemma): ■
http://update.eclemma.org/
Magyar billentyűzet kiosztás esetén a “{“ (Ctrl + B) használata: Preferences | General | Keys | Skip all brakepoints (Ctrl + Alt + B) → Unbind
○ Gradle: ■ Gradle IDE Pack 3.7.x + 1.0.x (STS) ■ Buildship Gradle Integration 1.0 (official) ●
https://gradle.org/eclipse/ 35
Eclipse: Configuration - Code Style ● Window | Preferences (type: formatter) ○ Java | Code Style | Formatter ■ New… ● ● ● ● ●
Profile name: uni-obuda-java-formatter Initialize: Eclipse [build-in] Indentation | Indent | Statement within ‘switch’ body Line Wrapping | General | Maximum line width: 160 Line Wrapping | Enum declaration ○ Policy: Wrap all elements, every element on a new line Constants policy: Wrap all elements, every element on a new line + Force split Comments | Line width | Maximum: 120 ○
●
36
Eclipse: Configuration ● Window | Preferences (type: save actions) ○ Java | Editor | Save Actions ■ Perform the selected actions on save ● ● ●
Format source code (all lines) Organize imports Additional actions - Configure ○ Code Organaizing: Remove trailing whitespaces ○ Code Style: Use blocks in if/while/for/do statements ○
Member Accesses: Use ‘this’ qualifier for field accesses: Always
○
Member Accesses: Use ‘this’ qualifier for method accesses: Always Unnecessary Code: Remove unused imports
○
37
Eclipse: Import Gradle project ● File | Import | Gradle | Gradle project ○ Project root directory: [GIT]\oejee\helloworld ○ Import options: Gradle wrapper (recommended) ■ De kiválasztható a helyi installáció is (Local installation directory…) ■ Első alkalommal a Gradle wrapper leszedi a legfrissebb Gradle-t A Gradle Eclipse plugin elsősorban a Gradle projekt struktúra kezelése, a projektek importálása miatt fontos. Eclipse-ből futtatni Gradle task-okat már ízlés dolga (van aki minden ilyesmit Eclipse-ből szeret futtatni, van aki ezt külön terminal/command window-ban teszi meg). 38
IntelliJ IDEA ● https://www.jetbrains.com/idea/ ● Commercial product ● Community verzió pl. JEE-t nem támogat, azonban Gradle alapból van benne (és jó!), e végett professzionális munkára így is megfelelő (bár vannak kompromisszumok) ● Sokszor gyorsabb mint Eclipse ● Más billentyűkiosztás, átszokni nem könnyű
39
Gradle és IntelliJ IDEA integráció [root] helloworld
[..] apply plugin: 'idea' [..] build.gradle
>gradle idea
cleanIdea, ideaModule, ideaProject, ideaWorkspace
helloworld.iml helloworld.ipr helloworld.iws
új állományok jönnek létre 40