Classpath включая JAR в JAR

Используя data.table, простое и элегантное решение:

library(data.table)

setDT(df1)
setDT(df2)

setkey(df2, ID, dateTarget)[, dateMatch:=dateTarget]
df2[df1, roll='nearest']

    ID dateTarget ValueMatch  dateMatch Value
 1:  3 2015-11-14         48 2015-07-06    47
 2:  3 2015-02-22         94 2015-03-09    52
 3:  1 2014-12-29         88 2014-12-06    18
 4:  3 2015-12-08         48 2015-07-06    98
 5:  2 2013-01-14         77 2013-04-08    52
 6:  2 2015-07-29         68 2015-08-01    97
 7:  3 2013-05-30         85 2013-04-01    91
 8:  1 2013-11-04         35 2014-02-21    70
 9:  2 2015-06-15         68 2015-08-01    98
10:  3 2014-11-17         95 2014-12-15    68
129
задан Paul Reiners 8 October 2008 в 15:09
поделиться

6 ответов

При попытке создать единственную банку, которая содержит Ваше приложение и его необходимые библиотеки, существует два пути (что я знаю о) сделать это. Первое Одна Банка , который использует специальный classloader для разрешения вложения банок. Второе UberJar, (или Оттенок ), который взрывает включенные библиотеки и помещает все классы в банку верхнего уровня.

я должен также упомянуть, что UberJar и Оттенок являются плагинами для Maven1 и Maven2 соответственно. Как упомянуто ниже, можно также использовать плагин блока (который в действительности намного более мощен, но намного тяжелее правильно настраивать).

91
ответ дан Carlos A. Ibarra 8 October 2008 в 15:09
поделиться

Я использую знатока для своих сборок Java, который имеет плагин, названный плагин блока знатока .

Это делает то, что Ваше выяснение, но как некоторые из других предложений описывают - по существу взрывающий все зависимые банки и повторно комбинирующий их в единственную банку

2
ответ дан Vinnie 8 October 2008 в 15:09
поделиться

Не пишущий Ваш собственный загрузчик класса. Можно добавить банки к пути к классу банки, но они должны соразмещаться, не содержаться в основной банке.

6
ответ дан Joe Skora 8 October 2008 в 15:09
поделиться

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

2
ответ дан James Schek 8 October 2008 в 15:09
поделиться

Я собирался советовать, чтобы извлечь все файлы на том же уровне, затем сделать банку из результата, так как система пакета должна сохранить их аккуратно разделенными. Это было бы ручным путем, я предполагаю, что инструменты, обозначенные Steve, сделают это приятно.

1
ответ дан PhiLho 8 October 2008 в 15:09
поделиться

Я считаю, что релевантная часть спецификации здесь:

Для предопределенных операторов число битов для сдвига вычисляется следующим образом:

  • Когда тип x равен int или uint, число сдвигов задается значением младшие пять битов счетчика. Другими словами, вычисляется число сдвигов из числа & 0x1F.

  • Если тип x является длинным или ulong, число сдвигов задается шесть битов подсчета низкого порядка. Другими словами, вычисляется число сдвигов из числа & 0x3F.

Если результирующее число сдвигов равно нулю, операторы сдвига просто возвращают значение x.

Значение 32 равно 0x20 . Выражение 0x20 & 0x1F вычисляется как 0 . Следовательно, число сдвигов равно нулю, и сдвиг не выполняется; выражение -1 < < 32 (или любое x < < 32 ) возвращает только исходное значение.

-121--4817369-

Необходимо изменить содержимое List < string > , переданное методу расширения, а не переменную, которая содержит ссылку на список:

public static void ForceSpaceGroupsToBeTabs(this List<string> lines)
{
    string spaceGroup = new String('.', 4);
    for (int i = 0; i < lines.Count; i++)
    {
        lines[i] = lines[i].Replace(spaceGroup, "T");
    }
}
-121--1476058-

Вы НЕ хотите использовать эти решения «расчленить содержимое JAR». Они определенно делают его труднее видеть вещи (так как все взорвано на одном уровне). Кроме того, могут возникнуть конфликты имен (не должны происходить, если люди используют правильные пакеты, но вы не всегда можете управлять этим).

Требуемая функция является одной из верхних 25 RFE Sun : RFE 4648386 , которые Sun в своей бесконечной мудрости обозначил как имеющие низкий приоритет. Мы можем только надеяться, что Солнце проснется...

В то же время, лучшее решение, с которым я столкнулся (которое я хочу, чтобы Sun копировал в JDK), это использовать пользовательский класс loader JarClassLoader .

50
ответ дан 24 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

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