Нет, вы определенно можете не использовать ClassLoader.definePackage
для «переопределения» некоторых пакетов изнутри банки.
Если я правильно понял, вы хотите, чтобы ваша JVM загружала любой класс под javax.xml.bind из def.jar, а все остальные из abc.jar. В этом случае вы можете (в моем личном порядке предпочтения):
1) Поместите def.jar перед abc.jar в CLASSPATH. Это требует, чтобы ни один класс, который вы хотите загрузить из abc.jar, присутствует в def.jar.
2) Разархивируйте def.jar, abc.jar или и то, и другое, и удалите любые конфликтующие классы, поэтому на самом деле не имеет значения, какой jar будет первым в CLASSPATH. Затем повторно застегните их. Или вы можете сделать это только на одной банке и поставить ее перед другой.
3) Используйте настраиваемый загрузчик классов (извините, не общедоступное доменное имя, о котором я знаю, дайте мне знать, если вы его найдете). Это может быть интересной темой для проекта ОС, за исключением того, что уже несколько инициатив с похожими (но гораздо более широкими) целями, некоторые из которых лежат в основе языка.
4) Создайте загрузчик классов для этой цели, возможно, расширив его по умолчанию.
Зачем вам это нужно? –
Простейшей задачей является поставить свою банку впереди другой в порядке поиска. ClassLoader.definePackage не делает ничего полезного для вас. –