Установите java classpath при выполнении конкретного jar [duplicate]

Попробовав решение, предложенное Желязным на относительно большом DataFrame (~ 400 тыс. строк), я нашел его очень медленным. Вот альтернатива, которую я обнаружил, чтобы быстрее выполнять заказы на моем наборе данных.

df = pd.DataFrame({
    'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4', 'MM4'],
    'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
    'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
    'count' : [3,2,5,8,10,1,2,2,7]
    })

df_grouped = df.groupby(['sp', 'mt']).agg({'count':'max'})

df_grouped = df_grouped.reset_index()

df_grouped = df_grouped.rename(columns={'count':'count_max'})

df = pd.merge(df, df_grouped, how='left', on=['sp', 'mt'])

df = df[df['count'] == df['count_max']]
76
задан Reza 12 August 2012 в 15:27
поделиться

6 ответов

Я предпочитаю, чтобы первая версия запускала Java-приложение только потому, что у него меньше ловушек («добро пожаловать в адский путь к классу»). Второй требует исполняемого файла jar, и путь класса для этого приложения должен быть определен внутри манифестной баночки (все остальные объявления classpath будут молча игнорироваться ...). Таким образом, со второй версией вам нужно будет заглянуть в банку, прочитать манифест и попытаться выяснить, действительны ли записи классаpath, откуда хранится банка ... Этого можно избежать.

Не ожидайте каких-либо преимуществ или недостатков производительности для любой версии. Это просто говорит jvm, какой класс использовать для основного потока и где он может найти библиотеки.

62
ответ дан Andreas_D 21 August 2018 в 11:43
поделиться
  • 1
    Как насчет потоков? Являются ли они одинаковыми с точки зрения количества потоков JVM при попытке запустить приложение? – Reza 12 August 2012 в 15:22
  • 2
    Да. Обе версии найдут основной метод и выполнит это с помощью одного потока. Первая версия передает имя класса в качестве аргумента, а вторая версия, jvm найдет ее внутри mainfest. – Andreas_D 12 August 2012 в 15:30

При использовании java -cp вам необходимо предоставить полное имя основного класса, например

java -cp com.mycompany.MyMain

При использовании java -jar myjar.jar ваш файл jar должен предоставить информацию о основной класс через manifest.mf, содержащийся в файле jar в папке META-INF:

Main-Class: com.mycompany.MyMain

10
ответ дан AlexR 21 August 2018 в 11:43
поделиться

Как уже говорилось, -cp - это просто указание jvm в командной строке, какой класс использовать для основного потока и где он может найти библиотеки (define classpath). В -jar он ожидает, что класс-путь и основной класс будут определены в манифесте jar-файла. Таким образом, другое - для определения вещей в командной строке, в то время как другие обнаруживают их внутри манифеста jar. Нет никакой разницы в производительности. Вы не можете использовать их одновременно, -jar переопределит -cp.

Хотя даже если вы используете -cp, он все равно проверит файл манифеста. Таким образом, вы можете определить некоторые из классов-классов в манифесте, а некоторые в командной строке. Это особенно полезно, если у вас есть зависимость от какой-либо сторонней банки, которую вы не можете предоставить своей сборке или не хотите предоставлять (ожидая, что она будет найдена уже в системе, где она должна быть установлена, например). Поэтому вы можете использовать его для обеспечения внешних банок. Это местоположение может различаться между системами или может даже иметь другую версию на другой системе (но с теми же интерфейсами). Таким образом, вы можете создать приложение с другой версией и добавить фактическую стороннюю зависимость к пути класса в командной строке при ее запуске в разных системах.

1
ответ дан Pehmolelu 21 August 2018 в 11:43
поделиться

С аргументом -cp вы предоставляете путь пути к пути к другим классам или библиотекам, которые могут потребоваться вашей программе при компиляции или запуске. С помощью -jar вы укажете исполняемый JAR-файл, который вы хотите запустить.

Вы не можете указать их оба. Если вы попытаетесь запустить java -cp folder/myexternallibrary.jar -jar myprogram.jar, то это не будет работать. Путь к классам для этого JAR должен быть указан в его манифесте, а не как аргумент -cp.

Здесь вы можете найти здесь здесь и здесь .

PS: -cp и -classpath являются синонимами.

46
ответ дан Radu Murzea 21 August 2018 в 11:43
поделиться
  • 1
    Моя забота о ресурсах? есть ли разница между ресурсами, которые они используют? – Reza 12 August 2012 в 14:58
  • 2
    @Hesam Если вы спрашиваете о различиях в производительности между -cp и -classpath, то нет, нет никакой разницы. – Radu Murzea 12 August 2012 в 14:59
  • 3
    Нет! Я имел в виду разницу в производительности между -cp (или -classpath) и -jar – Reza 12 August 2012 в 15:09
  • 4
    @Hesam С помощью -jar вы указываете, какой исполняемый JAR вы хотите запустить. С помощью -cp вы указываете пути (ы) к дополнительным классам / библиотеке, которые могут потребоваться вашей программе. 2 имеют совершенно разные цели. – Radu Murzea 12 August 2012 в 15:22
  • 5
    +1 для -cp и -classpath - синонимы. – duleshi 7 August 2013 в 07:14

Не будет никакой разницы в производительности. Используя java-cp, мы можем указать требуемые классы и jar в пути к классам для запуска файла класса java.

Если это исполняемый файл jar. Когда используется java -jar-команда, jvm находит класс, который должен запускаться из файла /META-INF/MANIFEST.MF внутри файла jar.

1
ответ дан ravi sankar reddy 21 August 2018 в 11:43
поделиться

java -cp CLASSPATH необходим, если вы хотите указать весь код в пути к классам. Это полезно для отладки кода.

Яркий исполняемый формат: java -jar JarFile можно использовать, если вы хотите запустить приложение с помощью одной короткой команды. Вы можете указать дополнительные зависимые файлы jar в вашем МАНИФЕСТЕ, используя пробельные разделители в записи класса, например :

Class-Path: mysql.jar infobus.jar acme/beans.jar

Оба они сопоставимы с точки зрения производительности.

10
ответ дан Reimeus 21 August 2018 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: