2 good answers already, but I'd like to add a bit of an explanation. JMS is an API standard, it does not define the wire protocol to the server. Therefore all JMS implementations have different wire protocols - therefore you'll always need the vendor-specific JARs. It is impossible to create a JMS client library that is compatible with all JMS providers.
In your source code you should avoid vendor-specific features (e.g. TIBCO EMS lets you access destinations with non-JNDI, native names and it has custom acknowledge modes). If you always use JNDI lookups, then only the JNDI URL and the initial context factory name will be specific to the server type.