I work on a commercial Java software and it is protected.
Is mandating an Internet connection acceptable in your case? In our case, our software only makes sense if there's an Internet connection and hence we can make reverse engineering impossible by simply following this mantra:
make sufficient part of the computation happen on the server side
There's nothing against this an attacker can do besides:
If our potential users are not happy with the fact that our software mandates an always-on Internet connection they can either buy or pirate one of our competitor's inferior product.
Think of it this way: nobody ever succeeded in playing on Blizzard's battle.net using fake/generated license keys.
Sure, a pirate could try to fake the whole battle.net, but then the pirated version wouldn't allow people to play in, say, the real WoW economy nor to compete on the real Starcraft ladder, etc.
Why did no-one managed to do that: because Blizzard made sufficient part of the computation happen on the server side.
Sufficient part of the computation happening on the server side effectively means: "good games pirates".
The more we move to an always-connected world, the easier it is to protect apps against piracy. Same for content (DRM), for the better or the worse.