Project

General

Profile

Getting Started » History » Version 28

Henning Blohm, 02.03.2015 10:23

1 3 Henning Blohm
h1. Getting Started with org.z2env
2 1 Henning Blohm
3
See also [[FAQ]]
4
5
To understand how z2 works, you need to understand at most what are z2 modules and components and what are component repositories and how these concepts interplay. 
6
7 17 Henning Blohm
Check out [[Getting Started#Understanding-Z2|Understanding Z2]] for that.
8 1 Henning Blohm
9
It is simplest to start by running a simple Java main program in z2 or a simple Web App. 
10
11
Follow this trail:
12
13
* [[Getting Started#Building-z2env-core|Building the core]]
14
* [[Getting Started#Running-a-Hello-World-main-program|Running a Hello World main program]]
15
* [[Getting Started#Running-a-Hello-World-Web-App|Running a Hello World Web App]]
16
* [[Getting Started#Developing-with-Eclipse-or-IntelliJ|Developing with Eclipse or IntelliJ]]
17
* [[Getting Started#Going-Multi-Module|Going Multi Module]]
18 14 Henning Blohm
* [[Getting Started#Going-System-Centric|Going System Centric]]
19 18 Henning Blohm
* [[Getting Started#Understanding-the-<HOME>|Understanding the <HOME>]]
20
* [[Getting Started#Understanding-Z2|Understanding Z2]]
21 1 Henning Blohm
22 9 Henning Blohm
---
23 1 Henning Blohm
24
h2. Building z2env-core
25
26
(For now, we need to build the core).
27
28 4 Henning Blohm
{{collapse
29 1 Henning Blohm
h3. Pre-requisites
30
31
* You need Git installed
32
* You need a JDK, at least version 7
33
* You need the ANT build tool
34
35
First clone http://git.z2-environment.net/z2env.core
36
37
<pre>
38
git clone http://git.z2-environment.net/z2env.core
39
</pre>
40
41 20 Henning Blohm
Change into *z2env.core/org.z2env.core.main* and run 
42 1 Henning Blohm
43
<pre>
44
ant -Doutput=<z2home> -Dsetup=<setup> 
45
</pre>
46
47
where <z2home> is where you want to install z2 (the *z2 home* that is) and <setup> is a choice of pre-configured content, actually component repositories.
48
49 19 Henning Blohm
If you omit *output* it will default to *gen/dist*. If you omit *setup*, no content will be pre-configured. 
50 1 Henning Blohm
51
Check the folder *setups* for available setups of the core build. These can be local (all repos will be cloned locally) or remote (repos will be remoted).
52
53
In general this build always updates only boot, z.jar, roots. It will not remove anything.
54
55
Example to install/update a core only into ../../z2env:
56
57
<pre>
58
ant -Doutput=../../z2env 
59
</pre>
60
61 23 Henning Blohm
To install/update a web-basic setup (with tomcat and eclipsoid support) that has all addons local (i.e. no further remote synchronization) run:
62 1 Henning Blohm
63
<pre>
64 23 Henning Blohm
ant -Doutput=../../z2env -Dsetup=web-basic-local
65
</pre>
66
67
If you want your installation to update itself with the latest addon changes, run 
68
69
<pre>
70 1 Henning Blohm
ant -Doutput=../../z2env -Dsetup=web-basic-remote
71
</pre>
72 19 Henning Blohm
73 23 Henning Blohm
Both will be fine for this tutorial.
74 1 Henning Blohm
75
Check out [[wiki#Understanding-the-ltHOMEgt|Understanding the <HOME>]] to learn more about the generated structure.
76
77 2 Henning Blohm
h4. Summary
78 1 Henning Blohm
79 2 Henning Blohm
* At any time you can update a z2 core installation by running the core build and using the *output* property to point to your installation
80
* Using the *setup* property you can choose between completely local setups (no remote access required - no automatic synchronization from remote either) or mostly remote setups (all except the core will be synchronized from remote repositories). 
81
82 4 Henning Blohm
}}
83
84 9 Henning Blohm
85
---
86
87 1 Henning Blohm
h2. Running a Hello World main program
88
89 5 Henning Blohm
In this section we will let z2 do what it is actually made for: Run some Java program in a modular environment without build and deploy.
90
91 4 Henning Blohm
{{collapse
92 21 Henning Blohm
For now, we will assume you have a z2 core installed in <HOME>. If you built the core as outlined above than <HOME> is the folder *z2env* next to your core clone.
93
94
In its purest form, all the core can actually execute is simple Java main programs. 
95 1 Henning Blohm
96
Being in a modular environment, even if we only want to say „Hello World“, we need a module. Let's call it the greeter module. In order to have a main program run by z2, we need to also declare a  component for it, as that is what we tell z2 to run (not a class – mind you – but rather a component in a module). Assuming we use the local component name hello, than the absolut component name is 
97
98
<pre>
99
greeter/hello
100
</pre>
101
102
Finally, as this component actually has implementation code, we need to declare a Java component. By convention this is 
103
104
<pre>
105
greeter/java
106
</pre>
107
108
Now, after installing in <HOME> the place to simply drop a module is under <HOME>/modules. You might need to create that folder.
109
110
All in all, here is the complete structure to create:
111
112
| <HOME>/modules/greeter/hello.properties | 
113
<pre><code class="ruby">org.z2env.component.type=org.z2env.main
114
component.className=greetings.Main
115
</code></pre> |
116
| <HOME>/modules/greeter/java/z.properties | 
117
<pre><code class="ruby">org.z2env.component.type=org.z2env.java
118
</code></pre> |
119
| <HOME>/modules/greeter/java/src.impl/greetings/Main.java |
120
<pre><code class="java">
121
package greetings;
122
123
public class Main {
124
  public static void main(String[] args) {
125
    System.out.println("Hello!");
126
  }
127
}
128
</code></pre> |
129
130
That gives us the two components of module greeter. To run this on the command line, run
131
132
<pre>
133
java -DcomponentName=greeter/hello -jar z.jar
134
</pre>
135 23 Henning Blohm
136
Somewhere between all the log content talking about repositories inspected by z2, you will see a humble "hello!".
137 1 Henning Blohm
138
Now, obviously this sample is not worth a modular execution environment. But even from here, you could check your module in with some Git repository that is referenced from the roots and all other users of the same repo would be able to run your component without installing anything.
139
140 2 Henning Blohm
h4. Summary
141
142
* Running a simple program in a modular environment requires no more than declaring the modules and add some code
143
* Apart from more technical component types, at the heart of the z2 core is to run simple Java main programs
144
145 4 Henning Blohm
}}
146 2 Henning Blohm
147 9 Henning Blohm
148
---
149
150 1 Henning Blohm
h2. Running a Hello World Web App
151
152 6 Henning Blohm
Rather than just running a Main program, using the Tomcat add-on we might as well run full-featured Web applications - of course: From anywhere, without build and deploy.
153
154 4 Henning Blohm
{{collapse
155
156 1 Henning Blohm
This introduction explains how to connect a z2 core to a given Tomcat installation and how to develop a simple Web Application.
157
158
Furthermore it describes how to use the Dev Repository and the Eclipsoid plugin for the Eclipse or the IntelliJ development environment.
159
160
h3. Pre-Requisites
161
162
* We assume a development workspace in *workspace*.
163
* Have a local Tomcat (7 or higher) installation.*
164
165
h3. Steps we are going to take
166
167
# Create a module with a simple Web app
168
# Make it visible to Z2
169
# Run the Web App in a Tomcat Web Container
170
171 24 Henning Blohm
At first get yourself a z2env core with the *web-basic-local* or *web-basic-remote* setup as described above. Make sure it is in your *workspace*. If you follow [[wiki#Building-z2env-core|Building the core]] this means running 
172 1 Henning Blohm
173
<pre>
174
ant -Doutput=workspace/z2env -Dsetup=web-basic-remote
175
</pre>
176
177 24 Henning Blohm
(*Note:* Use an absolute path for *workspace*!)
178
179 25 Henning Blohm
You can of course simply use the folder you installed into previously as your workspace (not the z2env folder but rather its parent folder!).
180 1 Henning Blohm
181 26 Henning Blohm
Using your IDE, whatever it is, create a new project (in Eclipse choose "Java Project") *hello* in *workspace* with the following structure:
182 1 Henning Blohm
183
| java/z.properties | 
184
<pre><code class="ruby">
185
org.z2env.component.type=org.z2env.java
186
java.privateReferences=\
187
	javax.servlet
188
</code></pre> |
189
| web/z.properties |
190
<pre><code class="ruby">
191
org.z2env.component.type=org.z2env.tomcat.webapp
192
webapp.path=/hello
193
</code></pre> |
194
| web/WebContent/index.jsp |
195
<pre><code class="html"><html><body>Hello! Did you know that 7*7=<%=7*7%>?</body></html></code></pre> |
196
| LOCAL | <empty file> |
197
198
Your *workspace* folder now contains two subfolders *z2env* and *hello*.
199
200
So far, that's it.  We will touch on the LOCAL file later. 
201
202
When we run Z2 knowing this Web Application, it will attempt to start a Tomcat Web Container that will serve the application's content. To do that, it needs to find one. 
203
204
In order to tell Z2 where to look, you can either set an environment variable *CATALINA_HOME* (you might have already – it's the Tomcat standard) or specify an environment variable *catalina.home*. 
205
206
To be on the safe side and assuming the location is */home/me/tomcat*, we open a terminal, change into *workspace/z2env* and run
207
208
<pre>
209
java -Dcatalina.home=/home/me/tomcat -jar z.jar hello/web
210
</pre>
211
212
Note, unlike for the main program, the command line will not return. Instead you can enter „q“ to quit or „s“ to synchronize. But first let's open a browser and check out 
213
214
<pre>
215
http://localhost:8080/hello
216
</pre>
217
218
*Note:* What you just created is a prototypical z2 module structure containing a Java component *java* (holding implementation) and a Web component *web*. 
219
220
Instead of creating the structure yourself, you could use the Eclipsoid plugin (introduced below) for that:
221
* In Eclipse: New / Others / new z2...., 
222
* In IntelliJ: New / Module / z2....
223
224
... but beware of the pre-generated configuration. Where it says *com.zfabrik* change to *org.z2env*.
225
226
227
*Note:* Now on to that LOCAL file. Unlike for the Hello World main program, this time it was to so-called Dev Repo that made our module available to z2. 
228
229
The dev repo is a key component to the development approach with z2. It checks for all modules that have a LOCAL file and that are stored some levels deep, relative to the parent folder of the z2 home (by default), which not so coincidentally is our workspace.
230
231
We call modules with a LOCAL file _armed_.
232
233
*Note:* By default the dev repo looks for modules beneath the parent folder of the <home> location. Use the system property *org.z2env.dev.local.workspace* to specify other locations (separated by comma) to check for modules.
234
235
236
Try this: 
237
238
# Remove LOCAL
239
# Enter „s“ for synchronization. 
240
# Check the URL above (should say „not found“)
241
# Create a LOCAL file again
242
# Synchronize
243
# Check again.
244
245
Similarly, from now on, changes made to the hello module will be picked up, whenever you synchronize.
246
247 2 Henning Blohm
h4. Summary
248
249
* Addons extend z2 with capabilities, such as a Tomcat hosted Web application (albeit running in z2's module environment)
250
* The _dev repository_ allows to flexibly define local modules. Modules can put into or out visibility by a simple LOCAL marker file.
251
252 4 Henning Blohm
}}
253
254 9 Henning Blohm
255
---
256
257 1 Henning Blohm
h2. Developing with Eclipse or IntelliJ
258
259
In this section we will add some code to the hello Web app and see how to develop using an integrated development environment like the Eclipse IDE or Jetbrains' IntelliJ IDEA.
260
261 4 Henning Blohm
{{collapse
262
263 1 Henning Blohm
h3. Pre-Requisite
264
265
* Have an Eclipse or IntelliJ installation
266
* Install the Eclipsoid plugin from http://z2-environment.net/eclipsoid/update/site.xml or by searching for "z2" in the IntelliJ Plugin Repository respectively
267
268
h3. Steps we are going to take
269
270
# Complete the development workspace setup
271
# Add a simple Controller
272
273
h4. In Eclipse
274
275 26 Henning Blohm
Use the workspace *workspace*. Create or re-use a Java project *hello* (if the *hello* module from above is no Java project yet, open its properties and add the Java _Project Facet_). You should now have an Eclipse development workspace that has one Java project named "hello". Right-click on the project and choose "Transform into z2 Project". A small "Z" icon should not decorate the project icon. 
276 1 Henning Blohm
277
Add a source folder *java/src.impl* to the project.
278
279
Try "Arm Z2 Projects" and "Disarm Z2 Projects" from the context menu. You should see a LOCAL file showing up and disappearing as well as the "Z" decoration showing a green halo and going back to normal. 
280
281
Go into Window/Preferences, pick "z2-Environment". Change the port to 8081, set the user to "z*" and the password to "z". Done.
282
283
h4. In IntelliJ
284
285 26 Henning Blohm
Add a source folder *java/src.impl* to the module. Feel free to remove any *src* source folder Eclipse may have generated for you. 
286 1 Henning Blohm
287
Start a new Project with root folder *workspace*. Press the "Manage z2-Modules" button in the toolbar. Import the *hello* module into your IntelliJ project. Open the Settings dialog, pick "z2-Environment". Change the port to 8081, set the user to "z*" and the password to "z". Done.
288
289
h4. Independently of whether you use IntelliJ or Eclipse
290
291
Start z2 as in the previous section but make sure the development support is enabled. Use this command line:
292
293
<pre>
294
java -Dcatalina.home=/home/me/tomcat -jar z.jar org.z2env.dev.shared/ready hello/web
295
</pre>
296
297
(possibly you want to turn this into a shell script)
298
299
*Note:* The _system state_ *org.z2env.dev.shared/ready* will pull up all necessary development support components. Make sure this is part of your to-be-run list.
300
301
302
Regardless whether you are using Eclipse or IntelliJ, press the "Resolve Classpath from Z2" button in the toolbar. This will make sure that all required dependencies for Z2 modules, as far as Java code is concerned, will be resolved for your workspace. 
303
304 26 Henning Blohm
Now add a class *SimpleController* in *java/src.impl* and change the following files:
305 1 Henning Blohm
306
| java/src.impl/hello/SimpleController.java | 
307
<pre><code class="java">
308
package hello;
309
310
import java.io.IOException;
311
312 11 Henning Blohm
import javax.servlet.ServletException;
313
import javax.servlet.annotation.WebServlet;
314
import javax.servlet.http.HttpServlet;
315
import javax.servlet.http.HttpServletRequest;
316
import javax.servlet.http.HttpServletResponse;
317 1 Henning Blohm
318 11 Henning Blohm
@WebServlet(urlPatterns="/do")
319
public class SimpleController extends HttpServlet {
320 13 Henning Blohm
    private static final long serialVersionUID = 1L;
321
322
    @Override
323
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
324
        String input = req.getParameter("input");
325 1 Henning Blohm
        if (input!=null && input.trim().length()>0) {
326 11 Henning Blohm
            req.setAttribute(
327
                "output",
328 12 Henning Blohm
                "Hello "+input
329 11 Henning Blohm
            );
330
            req.setAttribute("input",input);
331 1 Henning Blohm
        }
332
        req.getRequestDispatcher("/").forward(req,resp);
333
    }
334 16 Henning Blohm
}</code></pre> |
335 1 Henning Blohm
| java/z.properties | 
336
<pre><code class="ruby">
337
org.z2env.component.type = org.z2env.java
338
339
java.privateReferences=\
340
  javax.servlet,\
341
  javax.servlet.jsp.jstl
342
</code></pre> |
343
| web/WebContent/index.jsp |
344
<pre><code class="html">
345
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core_1_1" %>
346
<html>
347
<body>
348
  <c:if test="${not empty output}">
349
    <p><c:out value="${output}"/></p>
350
  </c:if>
351
  <form method="POST" action="<c:url value='/do'/>">
352
    Input: <input type="text" name="input"><input type="submit" value="go!">
353
  </form>
354
</body>
355
</html>
356
</code></pre>|
357
358
Make sure the *hello* module is armed (right-click) by having a LOCAL file.
359
360
Now synchronize your running z2 by either:
361
362
* Pressing the "Sync with z2-Environment" button in the toolbar
363
* Pressing ALT+y in your IDE
364
* Entering "s" on the command line running z2.
365
366
Go to http://localhost:8080/hello and check it out.
367
368 2 Henning Blohm
h4. Summary
369 1 Henning Blohm
370 2 Henning Blohm
* Using IDE plugins for Eclipse or IntelliJ you can conveniently develop for Z2.
371
* Regardless of the component types in use, all class path considerations will be resolved from Z2 and you will never need to change IDE configuration.
372
* Using the interplay of IDE plugin and the dev repository (see also [[FAQ#Development]]) synchronization from the IDE and overlay of modules with local development versions is simple and fast. 
373
374 4 Henning Blohm
}}
375
376 9 Henning Blohm
377
---
378
379 1 Henning Blohm
h2. Going Multi-Module
380
381
In this section we will extend the previous work by a simple service module. 
382
383 4 Henning Blohm
{{collapse
384 1 Henning Blohm
h3. Pre-Requisites
385
386
# Have all the results from the previous section ready.
387
# Start IDE and z2 as above.
388
389
390
h3. Steps we are going to take
391
392
# add a new module with a service API
393
# reference the module API from the *hello* module and invoke the service.
394
395
396 28 Henning Blohm
In your workspace, use Eclipsoid to create a new z2 Java module *goodbye* (File/New/Others/z2-Environment/New Java z2-Project). 
397
398
Until we have the new Eclipsoid plugin ready, open *java/z.properties* and change all *com.zfabrik.* prefixes to *org.z2env*. Essentially the file only needs the line
399 1 Henning Blohm
400
<pre><code class="ruby">
401
org.z2env.component.type=org.z2env.java
402
</code></pre>
403
404
In our API we will only expose an interface and rather leave the implementation hidden in the implementation parts of the module. We do that, as we prefer a strong separation of API and implementation. This is not at all required but a conscious design choice. 
405
406
407
| java/src.api/goodbye/GoodbyeService.java | 
408
<pre><code class="java">
409
package goodbye;
410
411
public interface GoodbyeService {
412
413
	String sayGoodbye(String in);
414
	
415
}
416
417
</code></pre> |
418
| java/src.impl/goodbye/GoodbyeServiceImpl.java | 
419
<pre><code class="java">
420
package goodbye;
421
422
public class GoodbyeServiceImpl implements GoodbyeService {
423
424
	@Override
425
	public String sayGoodbye(String in) {
426
		return "Goodbye "+in+"!";
427
	}
428
429
}
430
</code></pre> |
431 10 Henning Blohm
| service.properties | 
432 1 Henning Blohm
<pre><code class="ruby">
433
org.z2env.component.type=org.z2env.any
434
component.className=goodbye.GoodbyeServiceImpl
435
</code></pre> |
436
| java/z.properties | 
437
<pre><code class="ruby">
438
org.z2env.component.type=org.z2env.java
439
</code></pre> |
440
441
In effect we created the following:
442
443
* A module *goodbye* that has 
444
* A Java component with API and Implementation source code
445
* An _any_ component *goodbye/service* that manages the service implementation (as we will see below)
446
447
Back in the *hello* module, we want to use the _goodbye service_. We apply the following changes:
448
449
| java/z.properties | 
450
<pre><code class="ruby">
451
org.z2env.component.type=org.z2env.java
452
453
java.privateReferences=\
454
    javax.servlet,\
455
    javax.servlet.jsp.jstl,\
456
    goodbye
457
</code></pre> |
458
| java/src.impl/hello/SimpleController.java | 
459
<pre><code class="java">
460
package hello;
461
462
import goodbye.GoodbyeService;
463
464
import java.io.IOException;
465
466
import javax.servlet.ServletException;
467 13 Henning Blohm
import javax.servlet.annotation.WebServlet;
468 1 Henning Blohm
import javax.servlet.http.HttpServlet;
469
import javax.servlet.http.HttpServletRequest;
470
import javax.servlet.http.HttpServletResponse;
471
472
import org.z2env.components.IComponentsLookup;
473
474 13 Henning Blohm
@WebServlet(urlPatterns="/do")
475 1 Henning Blohm
public class SimpleController extends HttpServlet {
476 13 Henning Blohm
    private static final long serialVersionUID = 1L;
477 1 Henning Blohm
478
    @Override
479
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
480 13 Henning Blohm
        GoodbyeService gb = IComponentsLookup.CL.lookup("goodbye/service", GoodbyeService.class);
481 1 Henning Blohm
        String input = req.getParameter("input");
482
        if (input!=null && input.trim().length()>0) {
483
            req.setAttribute(
484 13 Henning Blohm
                "output",
485
                gb.sayGoodbye(input)
486
            );
487
            req.setAttribute("input",input);
488 1 Henning Blohm
        }
489
        req.getRequestDispatcher("/").forward(req,resp);
490
    }
491
}
492
</code></pre> |
493
494
After you have changed the Java references in *java/z.properties* you might want to press Alt-R or the "Resolve Classpath from Z2" button in the toolbar to have the IDE resolve the dependency for the *goodbye* module and so that
495
your IDE will not complain about using the *GoodbyeService* interface.
496
497
Now synchronize your running z2 by either:
498
499
* Pressing the "Sync with z2-Environment" button in the toolbar
500
* Pressing ALT+y in your IDE
501
* Entering "s" on the command line running z2.
502
503
Go to http://localhost:8080/hello and check it out.
504
505
h3. Discussion
506
507
What you just implemented is a programmatic component lookup. The first time <code>IComponentsLookup.CL.lookup("goodbye/service", GoodbyeService.class)</code> was invoked, z2 searched for a factory for *org.z2env.any* components. This specific factory simply created a singleton instance of the Goodbye Service and checked whether the requested interface is implemented. As that held, it returned the actual instance.
508
509
In later sections (for now check out [[z2-environment:How_to_Spring]]) we will explain how to that extends to the Spring Framework and Dependency Injection in general.
510 2 Henning Blohm
511
h4. Summary
512
513
* Being a modular runtime environment, Z2 offers an effective yet simple Java modularization approach
514
* The module concept of Z2 goes beyond code considerations and includes arbitrary component types such as Web applications
515 1 Henning Blohm
516
Feel free to apply changes to the Goodbye Service implementation class and have them made effective by synchronizing Z2.
517 4 Henning Blohm
518
}}
519 8 Henning Blohm
520 1 Henning Blohm
521 9 Henning Blohm
---
522
523 1 Henning Blohm
h2. Going System-Centric
524 2 Henning Blohm
525
In this section we show how to turn your z2 installation into a mere execution node of a system (which is what it really should be). That is, in team development situations for systems of non-trivial size of distribution requirements, it is crucial to be integrated with a common source code level. 
526 1 Henning Blohm
527 4 Henning Blohm
{{collapse
528
529 2 Henning Blohm
Using remote repositories in combination with the dev repository, z2 offers just that: Integration for all but those pieces you do actually need isolation from changes.
530
531
Using z2's synchronization approach rolling out changes to remote installation and scale-outs become a non-issue.
532 8 Henning Blohm
533
h3. Pre-Requisites
534
535
# Have the multi-module setup from the previous section at hand
536
# Start IDE and z2 as above.
537
538 2 Henning Blohm
539
h3. Steps we are going to take
540
541
# check our modules in with some new Git repository
542
# add a Git-based component repository component 
543
# develop with partial overlays
544
545
546 1 Henning Blohm
547 4 Henning Blohm
}}
548 1 Henning Blohm
549 9 Henning Blohm
550
551
---
552 1 Henning Blohm
553
h2. Understanding the <HOME>
554
555 4 Henning Blohm
We call an installation of a z2env core a *<home>*. The file structure of the *<home>* consists of few but important locations.
556 1 Henning Blohm
557 4 Henning Blohm
{{collapse
558 1 Henning Blohm
h3. Layout
559
560
| z.jar | The actual core implementation. This is precompiled.|
561
| boot/ | A component repository adding to the core and provides the most basic capabilities such as compiling Java code and running a main program. |
562
| roots/ | A file system component repository that is always registered by the core. This is typically filled with other repository components linking to remote or local component repositories. |
563
| modules/ | A file system repository declared under roots/ that is useful to locally augment a core installation.|
564
565
We use the modules repository for example for command line experiments and simple hacks. It is not as useful for regular development operations as is the dev repo.
566
567 4 Henning Blohm
568 1 Henning Blohm
h3. Folders and Properties
569
570
When running z2 from the command line, some logic is applied to derive where stuff is and some defaults apply:
571
572
|_. What |_. System property |_. Defaults |
573
| Z2 home - the installation location | org.z2env.home | If no system property is set, the environment variable Z2_HOME will be checked. If that is not set, the z2 home location will be derived from the location of the z.jar file |
574
| Dev Repo workspaces - where the Dev Repo checks for local modules | org.z2env.dev.local.workspaces | Defaults to ${z2.home}/.. assuming modules will be next to the home or one level deeper |
575
576 4 Henning Blohm
See also [[Core Layout]]
577 1 Henning Blohm
578
}}
579 4 Henning Blohm
580 17 Henning Blohm
---
581 18 Henning Blohm
582 1 Henning Blohm
h2. Understanding Z2
583
584
Most of the concepts that make up z2 can be derived from the desire to efficiently develop standard Java Web Applications that are defined in a central system definition. Add to that the wish to avoid all that build complexity and the desire for a practically usable modularization approach.
585
586 4 Henning Blohm
{{collapse
587 1 Henning Blohm
Once you loose the ability to tweak some build script or configuration to describe how to package a Web app or some libraries, you need some structural hint and simple declarations providing sufficient information.
588
589
Secondy, assuming you want to apply changes at runtime, you need some way of determining what to unload at runtime, given some changed file. Again: Structural information needs to present that maps to runtime state. 
590
591
Finally, as we want some support for modular application development anyway, why not make modules our essential structure. As we have not only code but also Web Applications, Data Sources,  Background Jobs and much more to consider, we add components with type into the mix. Voila.
592
593
*Component Repositories* provides modules and components to z2. A component is prefixed by the module name:
594
595
<pre>
596
<global component name> = <module name>/<local component name>
597
</pre>
598
599
In fact, the typical component repository has a file system style structure that is made up exactly like that. 
600
601
Structure from repo root:
602
603
| /<module>/<cmp>.properties | A component <cmp> in module <module> that has no resources on its own.|
604
| /<module>/<cmp>/z.properties | A component <cmp> in module <module> that may have additional resources on its own.|
605
606
Note that some components, like Web applications and typically Java components have file resources, such as HTML files or Java source code files, while other components, such as main program declarations or data source declarations, so not.
607
608
There are some conventions around this naming scheme. In particular, by convention, whenever a component requires Java implementation, z2 will first look for a component named *java* of the same module. As for example in the Hello World example.
609
610
To give you an idea what this model translates to at runtime consider this: At runtime, the static component is turned into a Resource instance by a component type implementation (that, in fact, is provided by another, built-in component type). 
611
612
!uml1.png!
613
614
Dependencies, for example those between Java components, translate into dependencies between resources that are observed during invalidation of resources. This introduces invalidation and synchronization.
615
616
h3. A crucial concept of z2 is that of a synchronization. 
617
618
For fast development roundtrips and in some cases for general configuration updates, it is desirable to not require a complete restart of a Java Virtual Machine process but rather just to change runtime state accordingly. 
619
620
In z2 a synchronization describes the following process:
621
622
# Check for changes in component repositories
623
# Based on changes found, identify components affected and invalidate associated runtime resources incl. dependent resources.
624
# Try to attain target states
625
626
That is, whenever you do a change and trigger a synchronization from your IDE, this is exactly what happens: Identify what needs to be thrown away, make sure to remove dependent stuff as well,  bring up what needs to be running.
627
628
h3. A second crucial concept of z2 is that of *System Centric Development*
629
630
When working on a software system with many access points and high re-use on a service level, as is typical for business systems, staying quick integration with a team's changes is key. Component repositories can be fed from remotely accessible version control systems such as Subversion and Git. When connecting to a central, team-shared repository, every synchronization will make sure that you are up-to-date with the real source of truth. 
631
632
Using the dev repo, you can still isolate yourself from changes on part of the system that you are actively working on. After your modifications are completed, rebased, and locally tested, getting a clean and consistent state is just one synchronization away.
633
634
h3. The third and final concept is that of a compile-free environment
635
636
It is within the nature of the synchronization concept, that anything required to happen to have your software available for execution must have happened after synchronization completed. Most preparation steps are executed at first use. This includes the compilation of Java code. Z2 uses the Eclipse Java Compiler for that purpose.
637
638
h2. The Component Model
639
640
See [[z2-environment:Z2_Modules_intro]]
641
642
h2. Java Components
643
644
See [[z2-environment:Z2_Java_components_intro]]
645 4 Henning Blohm
646
}}