2014-11-30 3 views
1

Я хотел бы знать, есть ли какая-либо функциональная разница между запуском моего Java-приложения с помощью командной строки -cp (предоставление папки или списка баннеров) и реализация класса загрузчик (например, с использованием класса URLClassLoader) для загрузки классов.Разница между запуском java -cp и реализацией classloader

Пример кода:

// -cp approach 
java -jar <myjar.jar> -cp ~/folder/with/jars 

Другой подход:

// URLClassLoader approach. urls is an array that points to the .jars under ~/folder/with/jars 
URLClassLoader loader = new URLClassLoader(urls); 
loader.findClass(...); 

ответ

1

Ну, например, с помощью загрузчика классов, как в вашем примере будет означать жестко прописывать пути в источнике, в отличие от -cp.

Плюс вы бы отвечали за загрузку классов самостоятельно, а не разрешали им решать jvm. Похоже, для меня слишком много лишнего кода, если нет веских оснований для этого.

Другая разница (и преимущество загрузчика классов) позволяет загружать их по требованию.

+0

«пути жесткого кодирования» - предположим, что они поставляются в качестве аргумента командной строки для программы. Затем они не жестко закодированы. Будет ли это иметь какие-либо функциональные различия? (тем самым я имею в виду - сможет ли программа загрузить один и тот же класс в обоих случаях, предположив, что доступные ему URL-адреса совпадают). –

+1

О, короткое зрение с моей стороны: P Я так не думаю. Как только классы будут загружены, все будет одинаково. – outlyer

1

В моей OpenJDK 7, система ClassLoader является экземпляром sun.misc.Launcher$AppClassLoader, который в свою очередь является подклассом URLClassLoader создается с файлами из системного свойства java.class.path.

Как вы можете видеть, в моем окружении, там, кажется, не важные функциональные различия, хотя существуют различия (как и тот факт, что этот AppClassLoader зарегистрирован в качестве «параллельно способны» с ClassLoader.registerAsParallelCapable() см ClassLoader Javadoc).

Поскольку Java переносима, я полагаю, что другие реализации JVM могут использовать аналогичные механизмы. Поэтому мне кажется, что не будет важных функциональных различий. Возможно, различия в политике разрешений по умолчанию, расширениях и т. Д., Которые я бы не счел функциональными.

Смежные вопросы