Если вариант с вынесением логики на сервер не канает, можно неявно валидировать rt.jar. Например, брать результат выполнения неких методов, который в некрякнутой версии должен быть ноль, и прибавлять это к расчетам в какой-то другой части программы. Если "умельцы" проморгают одну из таких проверок (их должно быть больше одной), то программа с подмененным rt.jar как бы будет работать, но время от времени падать.
Есть и другие техники защиты. Статей по теме много, погуглите.