Hola que tal.
Si tu aplicacion que has hecho esta totalmente en java, dudo mucho que puedas proteger tu codigo, ya que cualquier descompilador de java lo descompilara sin ningun problema, ahora si en verdad deseas proteger tu codigo, entonces puedes buscar una forma para interactuar entre java y c++, con esto ya podras proteger tu aplicacion pero perderas portabilidad, asi que tu decides.
Para que tu aplicacion tenga caducidad, lo que puedes hacer es usar un contador y cada vez que se utilice se decremente, o puedes tomar la fecha del sistema de la primera ves que se utilizo y compararla con la actual calculando la diferencia, y si ya se paso de la fecha, pues ya no permites que se habra la aplicacion.
Obiamente deberas crear un archivo en la primera ejecucion para que guardes estos datos y es sobre los datos del archivo donde realizaras las operaciones que te mencione. Te recomiendo que este archivo lo guardas en un lugar donde existan otros archivos del sistema para evitar que lo borren.
Espero te sirva.
Hasta luego.