Практически одновременно со средой программирования Delphi на свет появилась технология Java, включавшая три составляющих: одноименный язык программирования, очень похожий на язык C++, но более простой и безопасный; универсальный байт-код, в который компилировались программы на языке Java; интерпретатор (виртуальную машину) для выполнения байт-кода в любой операционной системе. Благодаря автоматическому управлению памятью — так называемой «сборке мусора» — резко повысилась надежность программ и скорость их разработки.
Поначалу на технологию Java возлагались большие надежды. Программные библиотеки для языка Java стали единым стандартом, поэтому написанные на нем программы оказались по-настоящему переносимыми. Однажды написанная и компилированная в байт-код программа могла работать на любой платформе без ограничений (единственное требование — наличие на этой платформе виртуальной машины Java).
Безграничная переносимость Java-программ родила идею сетевого компьютера и сетевых вычислений, суть которой в том, что все программы хранятся в байт-коде на серверах сети Интернет. Когда подключенный к сети пользователь запускает программу, то она сначала загружается к нему на компьютер, а затем интерпретируется. Охваченные этой идеей крупные фирмы ринулись осваивать новый рынок Java-приложений. Для языка Java появились средства визуального программирования, такие как JBuilder и Visual Age for Java. Казалось бы, бери и используй их для разработки пользовательского интерфейса и серверных программ. Но практически пропускная способность сети Интернет в лучшем случае обеспечивала оперативную загрузку на клиентские компьютеры лишь небольших по размеру программ. Кроме того, созданный на языке Java пользовательский интерфейс хронически отставал от возможностей операционной системы Windows и раздражал своей медлительностью. Поэтому технологию Java стали применять главным образом для разработки серверных приложений. Однако и здесь цена переносимости программ оказалась очень высокой — представленные в байт-коде программы работали на порядок медленнее аналогичных программ, компилированных напрямую в команды процессора. Применение динамической компиляции, при которой программа перед выполнением преобразуется из байт-кода в команды процессора и попутно оптимизируется, улучшило положение дел, но скорость работы Java-приложений так и не смогла приблизиться к скорости работы традиционных приложений. Иными словами, переносимость программ шла в ущерб их производительности и удобству. Многие начали задумываться над целесообразностью такой переносимости программ вообще.
Тем временем назревала революция в области серверных платформ — небывалыми темпами росла популярность операционной системы Linux.