Classpath isn’t dead… yet by Alexis Hassler
Classpath is dead!
What is the classpath anyway? In any code, there are basically two kinds of classes: those coming from the JRE, and those that do not (either becasue they are your own custom class or becasue they come from 3rd-party libraries).
Classpath can be set either with a simple java class load by the -cp
argument or with a JAR by the embedded MANIFEST.MF.
A classloader is a class itself.
It can load resources and classes.
Each class knows its classloader, that is which classloader has loaded the class inside the JVM (i.e. sun.misc.Launcher$AppClassLoader
).
JRE classes classloader is not not a Java type, so the returned classloader is null
.
Classloader are organized into a parent-child hierarchy, with delegation from bottom to top if a class is not found in the current classloader.
The BootstrapClassLoader can be respectively replaced, appended or prepended with -Xbootclasspath
,-Xbootclasspath/a
and -Xbootclasspath/p
.
This is a great way to override standard classes (such as String
or Integer
);
this is also a major security hole.
Use at your own risk!
Endorsed dir is a way to override some API with a more recent version.
This is the case with JAXB for example.
ClassCastException
usually comes from the same class being loaded by two different classloaders (or more…).
This is because classes are not identified inside the JVM by the class only, but by the tuple {classloader, class}.
Classloader can be developed, and then set in the provided hierarchy.
This is generally done in application servers or tools such as JRebel.
In Tomcat, each webapp has a classloader, and there’s a parent unified classloader for Tomcat (that has the System classloader as its parent).
Nothing prevents you from developing your own: for example, consider a MavenRepositoryClassLoader
, that loads JAR from your local Maven repository.
You just have to extends UrlClassLoader
.
JAR hell comes from dependencies management or more precisely its lack thereof. Since dependencies are tree-like during development time, but completely flat at runtime i.e. on the classpath, conflicts may occur if no care is taken to eliminate them beforehand.
One of the problem is JAR visibility: you either have all classes available if the JAR is present, or none if it is not. The granularity is at the JAR level, whereas it would be better to have finer-grained visibility. Several solutions are available:
- OSGi has an answer to these problems since 1999. With OSGi, JARs become bundles, with additional meta-data set in the JAR manifest. These meta-data describe visibility per package. For a pure dependency management point of view, OSGi comes with additional features (services and lifecycle) that seem overkill I personally *do not agree*.
- Project Jigsaw also provides this modularity (as well as JRE classes modularity) in the form of modules. Unfortunately, it has been delayed since Java 7, and will not be included in Java 8. Better forget it at the moment.
- JBoss Module is a JBoss AS 7 subproject, inspired by Jigsaw and based on JBoss OSGi.
It is already available and comes with much lower complexity than OSGi.
Configuration is made through a
module.xml
description file. This system is included in JBoss AS 7. On the negative side, you can use Module either with JBoss or on its own, which prevents us from using it in Tomcat. An ongoing Github proof-of-concept achieves it though, which embeds the JAR module in the deployed webapp and overrides Tomcat classloader of the webapp. Several problems still exists:- Artefacts are not modules
- Lack of documentation
Animate your HTML5 pages with CSS3, SVG, Canvas & WebGL by Martin Gorner
Within the HTML5 specification alone, there are 4 ways to add fun animations to your pages.
- CSS 3
-
CSS 3 transitions come through the
transition
property. They are triggered though user-events.Animations are achieved throughanimation
properties. Notice the plural, because you define keyframes and the browser computes intermediate ones.2D transformations-propertytransformation
includerotate
,scale
,skew
,translate
andmatrix
. As an advice, timing can be overriden, but the default one is quite good. CSS 3 also provides 3D transformations. Those are the same as above, but with eitherX
,Y
orZ
appended to the value name to specify the axis name. The biggest flaw from CSS 3 is that they lack draw features. - SVG + SMIL
-
SVG not only provides vectorial drawing features but also out-of-the-box animation features. SVG is described in XML: SVG animations are much more powerful that CSS 3 but also more complex. You’d better use a tool to generate it, such as Inkscape.There are different ways to animate SVG, all through sub-tags:
animate
,animateTransform
andanimateTransform
.Whereas CSS 3 timing is acceptable out-of-the-box, default in SVG is linear (which is not pleasant to the eye). SVG offers timing configuration through thekeySplines
attribute of the previous tags.Both CSS 3 and SVG have a big limitations: animations are set in stone and cannot respond to external events, such as user inputs. When those are a requirement, the following two standard apply. - Canvas + JavaScript
-
From this point on, programmatic (as opposed to descriptive) configuration is available. Beware that JavaScript animations comes at a cost: on mobile devices, it will dry power. As such, know about method that let the browser stop animations when the page is not displayed.
- WebGL + THREE.js
-
WebGL let use a OpenGL API (read 3D), but it is very low-level. THREE.js comes with a full-blown high level API. Better yet, you can import Sketchup mesh models into THREE.js.In all cases, do not forget to use the same optimization as in 2D canvas to stop animations when the canvas is not visible.
In order to not care about prefix, prefix.js let us preserve original CSS and enhance with prefix at runtime. Otherwise, use LESS / SASS. Slides are readily available online with associated labs. |
I remember using the same 3D techniques 15 years ago when I learnt raytracing. That’s awesome!
The Spring update by Josh Long
Talk is shown in code snippets, rendering full-blown notes mostly moot. It is dedicated to new features of the latest Spring platform versions
Version | Feature |
---|---|
3.1 |
|
3.2 |
|
4 |
|
Bean validation 1.1: we’re not in Care Bears land anymore by Emmanuel Bernard
All that will be written here is not set in stone, it has to be approved first. Bean Validation comes bundled with Java EE 6+ but it can be used standalone.
Before Bean Validation, validations were executed at each different layer (client, application layers, database). This led to duplications as well as inconsistencies. The Bean Validation motto is something along the lines of:
Constrain once, run anywhere
1.0 has been released with Java EE 6. It is fully integrated with other stacks including JPA, JSF (& GWT, Wicket, Tapestry) and CDI (& Spring).
Declaring a constraint is as simple as adding a specific validation annotation. Validation can be cascaded, not only on the bean itself but on embedded beans. Also, validation may wrap more than one property to validate if two different properties are consistent with one another. Validation can be set on the whole, but also defined subsets - called groups, of it. Groups are created through interfaces.
Many annotations come out-of-the-box, but you can also define your own.
This is achieved with the @Constraint
annotation on a custom annotation.
It includes the list of validators to use when validating.
Those validators must implement the Validator
interface.
1.1 will be included in Java EE 7. The most important thing to remember is that it is 100% open. Everything is available on GitHub, go fork it.
Now, containers are in complete control of Bean Validation components creation, so that they are natively compatible with CDI. Also, other DI containers, such as Spring, may plug in their own SPI implementation.
The greatest feature of 1.1 is that not only properties can be validated, but also method parameters and method return values. Constructors being specialized method, it also applies to them. It is achieved internally with interceptors. However, this requires an interception stack - either CDI, Spring or any AOP, and comes with associated limitations, such as proxies. This enables declarative Contract-Oriented Programming, and its pre- and post-conditions.
Conclusion
Devoxx France 2013 has been a huge success, thanks to the organization team. Devoxx is not only tech talks, it is also a time to meet new people, exchange ideas and see old friends.
See you next year, or at Devoxx 2013!
Thanks to my employer - hybris, who helped me attend this great event!