Як вже було сказано, -cp - це просто сказати jvm у командному рядку, який клас використовувати для основного потоку та де він може знайти бібліотеки (визначити classpath). В -jar він очікує, що шлях до класу та основний клас будуть визначені в маніфесті файлу jar. Тож інше призначене для визначення речей у командному рядку, а інших знаходження їх у маніфесті jar. Різниці в продуктивності немає. Ви не можете їх одночасно використовувати, -jar замінить -cp.
Хоча навіть якщо ви використовуєте -cp, він все одно перевірятиме файл маніфесту. Таким чином, ви можете визначити деякі шляхи до класу в маніфесті, а деякі в командному рядку. Це особливо корисно, коли у вас є залежність від якоїсь сторонньої банки, яку ви можете не забезпечити своєю збіркою або не хочете надавати її (очікуючи, що вона знайдеться вже в системі, де вона буде встановлена, наприклад). Тож ви можете використовувати його для подачі зовнішніх баночок. Її розташування може відрізнятися між системами або навіть може мати іншу версію в іншій системі (але має однакові інтерфейси). Таким чином, ви можете створити додаток за допомогою іншої версії та додати фактичну залежність від стороннього класу до контуру в командному рядку під час його запуску в різних системах.