You can obfuscate it, but that really only makes it more difficult to actually use the code when decompiling. Your classes end up named A, B, C, etc. with the methods renamed to aa, bb, cc, etc.
But other than changing names, and some slight reorganization of code (in-lining simple methods, unrolling basic for loops) the logic behind the code is the same. A determined person could still do it.
Signing the packages would be a way to detect tampering if someone tried to reassmble your jar file and just slip it in the program, but offers no protection against people extracting classes from the package.
There are a few other ways to make it difficult to accomplish (the encrypted class loader idea), but no way to make it impossible.
Standard security procedure is that an outside person should be able to have the source, know the algorithms used, but still not gain access to the protected item. Perhaps you need to rethink your approach.