Blog

This week we released a new minor version of JRebel. You can download the latest version of JRebel right now.

The new version includes a number of bugfixes and improvements for GWT, Tiles, Spring, Liferay, JBoss, etc. See the changelog for the full list of additions.

There’s one very specific fix that concerns Spring users: for the <include> directives in Spring XML configuration files, if the included resources are specified using wildcards (*), given there’s multiple resources with the same name, the things didn’t work quite well.

The current release now includes a small fix, which is actually disabled by default, that tries to fix the aforementioned shortcoming. The feature is enabled using -Drebel.spring.classpath_classloader_delegate=true VM argument.

We’re still working on JBoss 7 CDI integration making it more stable with every release. Hopefully we can cover all the use cases, and we’re looking for the users’ feedback!

Download the latest version of JRebel today!

Last week was a great week for ZeroTurnaround. On Monday we grew by 10% head count wise and I plotted the trend. It was humongous. My calculations showed that we will reach 600 billion people by the end of the year. This introduced a lot of questions and couple of interesting threads. Also it meant that our first intern ever hired had a lot more on his plate than first expected. I’ve compiled one of the public threads just for you guys. It tells you how and why we have a document Will ZeroTurnaround reach Gravitational Singularity and also to state that we actually don’t pack people together 100% flesh to flesh.

ZeroTurnaround and Red Hat’s JBoss teams have been spending a lot of time working to make Java faster, more efficient and more community-based. We already support the JBoss Forge team with free JRebel OSS licenses, and now we see that the JBoss Arquillian team has started to see the real value in cutting out redeploys in development using JRebel.

JBoss Arquillian is an awesome tool for integration testing of enterprise Java applications brought by JBoss folks to the community. It enables real in-container testing with no mocks, and writing the tests is made very simple, just like if you would write ordinary unit tests.

Even though Arquillian improved integration testing experience a lot, it still deploys the test suite to a container, and doing that repeatedly leads to the problem that JRebel fights against, avoiding restarts and redeploys. With the brand new JRebel extension for Arquillian the tests are deployed only at the first execution, and for the repetitive runs JRebel kicks in and updates the test and application code in the running container.

Arquillian 1.0.0. final was released just recently and some splendid news were announced last week: a special JRebel extension was added to Arquillian project.

Source code is available at Github: https://github.com/arquillian/arquillian-extension-jrebel
And you can track the progress in the dedicated JIRA: https://issues.jboss.org/browse/ARQ/component/12315771

P.S. Arquillian guys: if you need any more free JRebel licenses, write to oliver@zeroturnaround.com

ZeroTurnaround is proud to announce Frostbyte, a new stack-based language for the JVM. The language was born out of frustration of working with the standard Java software stack and tools. Hopefully this language will be the long awaited answer to the myriad of JVM languages that have hit the streets in the past couple of years. With some confidence, we believe that Frostbyte will solve both social and engineering problems that software developers have to deal with.

A key innovation in Frostbyte as a stack-based language is the use of inverse reverse Polish notation with parentheses. Instead of first putting things on the stack and then executing an instruction on it, we let you write it the other way around, which feels more natural.

Frostbyte code maps very closely to Java bytecode, and any overhead in code becomes blatantly obvious. Instead of adding in the whole kitchen sink, we chose to cherry-pick the features that make the language both easy and simple yet powerful enough to replace Java in most if not all applications.

Examples

Let’s look at a basic hello world example:

fun main :=
  (call echo „Hello World!)

Frostbyte lets you define chunks of bytecode that are always inlined when called. For example, the standard library defines echo as a chunk:

chunk echo :=
  (with System (with (get out) (call println ...)))

And the expanded form of the hello world is:

fun main :=
  (with System (with (get out) (call println „Hello World!)))

Instead of Strings, Frostbyte has Ropes as the main text type, but Ropes are implicitly converted to Strings, e.g. when interfacing with existing Java code.

fun main (args: Rope[]) :=
  (echo (with „Hello, “ (call concat (args head))))

If the above is saved in a file hello.fb, you can run it with the fb command.

> fb hello Jim
Hello, Jim

The Frostbyte language is fully internationalizable. In fact, the built-in default language is Estonian, but language is detected from each source file. Other languages are provided as simple translation files — English (British) and Russian are included by default. For example:

Köis=Rope
esik=main
kaja=echo
võttes=with
kutsu=call
jätka=concat
head=pea

The Estonian translation of hello.fb would be:

fun esik(argumendid: Köis[]) :=
  (kaja (võttes „Hello, “ (kutsu jätka (võttes argumendid (kutsu pea)))))

You can also provide translation maps for your own code — the translations are stored as annotations in .class files. The Frostbyte IDE (coming soon) has knowledge of these translations and will suggest code completions based on your selected language.

Of course, no language introduction is complete without the Fibonacci example. There are several ways to do it. While if statement + recursion is one way, we are trying to deprecate the if statement, since it’s really just a degenerate form of pattern matching. One way to do pattern matching in Frostbyte is to describe the patterns in function arguments and provide a separate function body for each case.

fun fib (0) := 0
fib (1) := 1
fib (n) := + (call fib (- n 1)) (call fib (- n 2))

As you can see, operators like + and * don’t need the call keyword. You can also create your own operators by using the op keyword instead of fun.

Pattern matches can also appear as expressions in function bodies. Here’s an example in Estonian. We’ll also introduce code blocks, loops/closures and let (olgu) keyword.

// get current time as Aeg (Time) type
amps praegu: Aeg := pööra (võttes System (kutsu currentTimeMillis)) Aeg
 
// Funktsioon, mis leiab raamatukogust laenutatud raamatud, mille tagastamisega on hilinetud või mis on rikutud
fun leiaHilinenudRaamatud := (
 olgu raamatud := võttes Andmebaas (kutsu leiaLaenutatudRaamatud);
 võttes raamatud (kutsu koonda ( raamat ->
   ons? (< (võta tähtaeg) (kutsu praegu)) ->
     (uus Hilinemine raamat)
   ons? (võta rikutud?) ->
     (uus Rikkumine raamat)
 ))
)

For those few who don’t speak Estonian, a translation is in order:

amps=chunk
praegu=now
Aeg=Time
pööra=convert
olgu=let
koonda=collect (filter + map)
ons?=case (introduce a pattern)
uus=new
raamatud=books
raamat=book
tähtaeg=due date
etc.

Complex Example

Let’s look at a bit more complex example that introduces classes as well.

class Vector2(x: Double, y: Double) :=
 // dot product
 op ‌·(that: Vector2) :=
   + (* (get this x) (get that x)) (* (get this y) (get that y))

We can write (get this x) as a shorthand for (with this (get x)). But we can also use the with keyword to shorten the field accesses:

op ‌·(that: Vector2) :=
  (with this (
    + (* (get x) (get that x)) (* (get y) (get that y))
  ))

But even better, if we write with X or Y, then a tuple of X and Y is put on the stack, and any access to their fields or methods will alternate between X and Y.

op ·(that: Vector2) :=
 (with this or that (
   + (* (get x) (get x)) (* (get y) (get y))
 ))

We can then see some repeating patterns here and can reduce it down further

(with this or that (
   + (* dup (get x)) (* dup (get y))
 ))

dup will duplicate the next bytecode instructions, but combined with this or that means the first (get x) will be (in Java-speak) this.x and the next (get x) will be that.x . How cool is that.

Bytecode

I bet you are curious about the kind of bytecode generated by Frostbyte. Lets look at the expanded hello world again.

fun main := (with System (with (get out) (call println „Hello World!)))

javap gives us this:

  0:   getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
  3:   ldc             #22; //String Hello World!
  5:   invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)
  8:   return

So the translation is quite straightforward: with System (get out) in this case translates to getstatic, then “Hello World!” to ldc, and call to invokevirtual. call always translates to either invokestatic, invokevirtual or invokespecial, except when it’s used to expand a chunk, in which case it gets replaced with the chunk and any arguments are inserted into the bitemarks (e.g. in the echo chunk, is a bitemark).

chunk echo := (with System.out (call println ...))

Frostbyte 1.0 Roadmap

The language is still in development, but we are getting close to the first public Beta release. For 1.0, we have some more awesome things planned:

While we are still working towards the first publicly available version, here are some links for you to familiarize yourself with the language to be ready for the big release.

Into the Future

We think Frostbyte will make a real change to the way software is developed. ZeroTurnaround is confident that it will become the next Java and will solve most of the problems that plague developers around the world, such as difficulties dealing with concurrency, parallelism, and the CPU-memory gap.

The Frostbyte 2.0 compiler will have built-in AI that is able to make aesthetic judgments about your code and will outright disallow ugly code, over-abstractions and excessive copy-and-pasting *.

To enable the latter, the AI will have a connection to a centralized data cloud and will be able to compare your code to everyone else’s. It will automatically find copyright and patent infringements and end the software patent wars forever. The AI will utilize automated crowd sourcing to some extent and you can also play your part in improving everyone’s code!

Exciting times are ahead and we are glad to take part in inventing the future!

* we know some people want more freedom, and are working on ways to lift some of these constraints for commercial Frostbyte subscriptions.

In two weeks after the 4.6 release we are releasing a bugfix release based on the feedback that our awesome users provided us after trying the the 4.6 final version. The changelog isn’t huge this time, but it includes some very specific improvements that will make the users happy.

GWT plugin was improved in terms of deployment performance. In JRebel 4.6, users reported so performance drawbacks on the startup of the container, so we spend some time for optimizing the integration.

Spring 3.1 specific features handling was improved. Now, it is possible to redefine @Bean annotated singletons that are bootstrapped by @Configuration-annotated class. Previously, it was only possible to add new beans. Also, support for @ImportResource was added now.

The last but not least noticeable feature that was added is the support for Jetty 4. We know that some of our users are suffering from legacy, and sometimes it is not really possible to update container/framework/library that is welded into the 10-year-old Java project. Whenever we can, we add the support for legacy technologies as well, especially if users ask for it. So here you go – JRebel works with Jetty 4 now.

If you remember, JRebel 4.6 came out with an awesome new feature – JRebel Remoting – which saves a lot of time in case of remote deployments. We’d be happy to hear from our users, how do you like it? Feedback is essential!


Remember those “Down for Maintenance” signs? Seeing that on any site means something’s not going right. Behind every ‘Down for Maintenance’ sign is frustrated operations staff, sleep-deprived developers, and angry managers letting everyone know how much money the company is losing with every minute of downtime. It is an awful experience for everyone involved.

In May of 2011, we released LiveRebel 1.0 – a tool that brought the hotpatching technology that powers JRebel to production environments with safeguards like compatibility checks and stop-the-world updates. As more and more users deployed in production, we realized that hotpatching was just the beginning. Wouldn’t it be great if there were a tool that could be dropped into an existing infrastructure, easily start managing the production servers, and would allow any and all updates to be applied with no downtime?

LiveRebel 2.0 is that product.

The most common way of updating an application online is often to take one server at a time from a cluster, stop it, update the application and restart it. Immediately after LiveRebel is installed, it adds the ability to do rolling restarts completely automatically.

Of course, we make this all possible without any changes to the existing infrastructure, due to the fact that with LiveRebel, which is all Java-based, every server can act as a load balancer, redirecting the new sessions to other servers while keeping the existing ones where they should be. So from both a user perspective and the administrator perspective, all servers are alive and functioning at all times, with all the redirection happening as if by magic.

So what does this mean?

  • Every single update is an online, transactional, reversible operation that is completely automated and, in case of minor updates, instantaneous.
  • When something goes wrong, as it inevitably does, there is a panic button to press that will make it all better.
  • The application stays online, the updates can be done during the day and the business doesn’t lose a cent of revenue.
  • Developers can see their code in production faster. At an extreme, the code can even be deployed continuously, since fixing or reverting things is so darn easy.

It means that you are happier, and that makes our day.

It is our pride and pleasure to present LiveRebel 2.0.

The last year has been great for ZeroTurnaround. We released JRebel 4.0 and LiveRebel 1.0 to universal acclaim. We grew to a company of 40 people dedicated to building amazing products and keep bringing more value to our users. We won 3 awards in a single year, and hosted GeekOut, the first-ever Java conference in Estonia. We worked hard, we had tons of fun and we stayed very, very geeky.

What’s next? Every year a new set of buzzwords seems to promise salvation for those who embrace them. SOA, OSGi, Cloud, etc. But for most folks they are meaningless, as the architecture and environment have been created ages ago, and now porting apps to a new infrastructure is almost as hard as rewriting them from scratch. We believe that we can offer you an alternative, where tools can be plugged right into your existing infrastructure and eliminate inefficiencies & other problems without creating any new ones. LiveRebel is our first foray in that direction, with others to come down the line.

With all that hard work ahead of us, I’d like to put a piece of news on the table. From the February 9th, 2012, David Booth has left his role as ZeroTurnaround CEO and I have taken over the helm in order to make our vision a reality. I’d like to thank David for his time and hard work. He joined ZeroTurnaround even before we were large enough to be an entity of our own in Estonia. He brought JRebel into the hearts and workplaces of tens of thousands of Java developers, fueled our rapid growth with his passion and worked hard to make our success a reality.

Though David decided to step aside from the leadership role, he will continue assist us in the growth of the company from his position on the Advisory Board. We are grateful for his huge additions to the company, and wish him yet new challenges, and we will look forward to working with him in the future, talking about the good ol’ startup days and having another beer.

Captains come and captains go, but the mission continues.

Best Regards,

Jevgeni Kabanov
Founder & CEO of ZeroTurnaround

During the season of holidays, even the code-geeks lift their heads from the computer and ask themselves: what is it that I am doing and why am I doing it? At ZeroTurnaround, the answers came quickly when we had a all-hands-aboard team meeting in Estonia last week.

The answers were quick to come (hey, we need to get back to our code, not fool around and do nothing!), such as that ZeroTurnaround has a product that actually gives value and is needed by our customers (have you heard of JRebel?), that our team consists of intelligent people who take responsibility for their work, and on top of that we can still have tequila shots at work parties. There was something else that still is ringing in my head like a Christmas Carol, which is what Oleg from the LiveRebel team said: “When I look at Lauri’s or Rein’s written code, I think to myself that it’s a work of art!” All in all: We make art with passion in our office.

We hope that our passion for making Java fast and fun helps you write gorgeous code, and inspires you to turn your work into an piece of art. Have a wonderful holidays and a great New Year!

 

 

President Toomas Hendrik Ilves of Estonia is a tall, impeccably dressed man with a bow tie whose 45-minute visit to our bigger and brighter offices might at first seem intimidating to a group of geeks. Luckily, President Ilves has a bit of inner geek of his own–the visit marked an occasion to celebrate ZeroTurnaround’s contributions and impact on Estonian economy and awareness and reach of Estonian IT in the world. ZeroTurnaround’s innovations are making waves in the global IT world by winning three awards in a single year (the JAX Innovation Award, Duke’s Choice Award and the Estonian Innovator of the Year Award), and growing the team size by 250% in 2011 alone.

So what did we talk about?

Well, President Ilves is not a JRebel user, so we described our first product line with gusto and snacks, then described LiveRebel and how we see the future of continuous deployment (and continuous delivery). More related to his interests, co-founders Jevgeni Kabanov and Toomas Römer discussed ZeroTurnaround’s global markets, spreading the good word and raising awareness about the Estonian IT sector and e-Estonia, our drive to hire the best developers in the Estonian market, and the company’s ambitious plans for 2012 and beyond.

Thank you, Mr. President, and hope to see you soon for a sauna visit! ;-)

 

Morning coffee between the man who created JRebel, Jevgeni Kabanov and The President of The Republic of Estonia, Mr Toomas Hendrik Ilves

From Tartu to the World: Mr President's visit was a huge honor to ZeroTurnaround's team and their efforts

How can we together bring Estonian innovative IT products and services into focus?

Pictures by Rein Raudjärv

This week, JRebel 4.5.1 was released! Although it was a minor release, you can still spot quite a lot of interesting improvements. The new features are in beta stage and would love to get the feedback from users to polish the even more. This time we have payed attention to JAX-RS – the new plugins for Jersey and Apache CXF were added to the distribution and tested on an enormous number of containers, including JBoss, WebLogic, Tomcat, Resin and many others. We have tested and improved our integration for EJB 3.1 Lite on Glassfish 3. JRebel integrations were updated to support the recent versions of containers, e.g. Virgo 3 and Resin 4.0.23. And there’s also a number of fixes included – check out the changelog!

Now JRebel team is working on more awesome stuff to come with the next updates, stay tuned!

Older Entries »

Join the Rebellion Facebook Twitter RSS feed