Обычно подразумевается, что если вы делаете заказную разработку, и заказчик её оплачивает, то вы передаёте ему исключительные права на получившийся программный код, соответственно он вправе копировать и передавать его кому угодно и как угодно. В этом ключе собственно и стоит действовать, тогда и защищать не придётся.
Но если всё же необходимость защитить есть, то к вам в копилку могу подкинуть ещё 1 вариант:
- генерите аппаратный ID машины (не уверен, что можно напрямую из Java, но наверняка есть варианты, например, на C++ с возможность прокинуть их в Java)
а дальше уже варианты:
1) Можно просто каждый раз проверять ID машины и запускать если он тот же, в противном случае блокировать запуск
2) Можно предложить пользователю передать вам ID машины, для того, чтобы вы сообщили ему ключ активации (ключ может быть получен каким-либо преобразованием ID-машины).
Но помните, что в любом случае абсолютной защиты не бывает, вопрос по большому счёту только во времени и желании эту защиту взломать.