2010-09-29 3 views
3

У меня 204 общих класса (большинство классов - это внутренние классы). В течение нескольких месяцев я строил отлично с помощью SCons (SCons просто вызывает команду jar).Когда команда «jar» откажется добавить класс в файл .jar?

По какой-то причине он прекратил добавлять последний внутренний класс для определенного класса. Например, предположим, что у меня есть следующие классы:

class1 
class2 
class3 
class4 
class5 
class6 
... 
class79 
class80 

Перед этим последним изменением, Шонс все в порядке. Но СЕЙЧАС ... он специально не добавляет класс80 к своей команде jar. (Я вижу упущение класса 80 в команде jar).

Есть ли экземпляр, в котором команда jar просто игнорирует определенные классы?

----------- ИЗМЕНИТЬ. Я нашел преступника. По какой-то причине этот внутренний класс не распознается моими Скунами!

vehicleFilter = new RowFilter<Object, Object>(){ 
public boolean include(Entry<? extends Object, ? extends Object> entry)    {             
    {return false;} 
}; 
+0

Я видел, что проблема была изолирована, но не знаю, почему она ломается под SCons/jar. Я работаю с JTables и добавляет RowFilter ... по какой-то причине он не принимает внутренний класс фильтра строк? Но это все еще не решает мою проблему. –

+0

Это единственный анонимный тип, который игнорируется, или это единственный анонимный тип, который у вас есть, период? –

+0

Привет Тим. Из 204 классов примерно половина - это анонимные классы (класс, класс $ 1, класс $ 2 ... и т. Д.). У меня также есть смесь местных классов. –

ответ

1

Вместо того, чтобы передавать весь список файлов классов команде Jar, вы можете передать каталог. Это позволяет избежать проблем с JSA-анализатором SCons, поскольку SCons сканирует каталог для файлов и накапливает все, что находит.

что-то вроде следующего будет компилировать файлы в «ЦСИ» в директории «классов», а затем создать банку с содержимым «классы»:

env = Environment(tools=['javac', 'jar']) 
env.Java(target='classes', source='src') 
env.Jar(target='foo.jar', source=['classes', 'Manifest.txt'], 
     JARCHDIR='$SOURCE') 

файл манифеста «Manifest.txt» является в корне вашего проекта здесь. Единственное требование состоит в том, что он начинается с текста «Манифест-версия».

+0

Все становится сложнее, если у меня есть файл Manifest.txt в миксе. Если у меня есть этот манифест, и я хочу, чтобы он был каталогом корневого уровня моего проекта (dir before src/и classes /), как бы это сделать? SCons пропускает его, если мы разрешаем JARCHDIR классам/ –

+0

Вы можете скопировать манифест в dir (классы) сборки. – richq

+0

На самом деле, не нужно копировать.Я обновлю ответ на манифесты ... – richq

0

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

Вам нужно заглянуть внутрь пакета SCons, чтобы узнать, что происходит.

Любая конкретная причина, по которой вы не просто используете муравей?

+0

Да ... мой проект - это в основном все C++ с этим исключением. Я лично не думаю, что это предел слишком длинный (хотя 204 довольно большой). Я сузил его до класса RowFilter. См. Мой отредактированный q –

2

Вам нужно добавить JAVAVERSION='1.6' в качестве аргумента к вашему env.Java() вызова:

env.Java(target='classes', source='src', JAVAVERSION='1.6') 

Без этого, если вы компилируете с текущим javac, SCons не определить правильные имена для анонимных внутренних классов, поэтому, когда эти имена файлов с плохим классом будут переданы в jar, он потерпит неудачу.

+0

Эй! Спасибо за это. Я буду помнить об этом в будущем. –

+0

В файлах классов jar'ing (в моем случае использования) SCons, кажется, не собирает все файлы классов для класса с внутренними классами (не анонимные внутренние классы, кстати). Добавление 'JAVAVERSION', похоже, не помогло мне решить эту проблему. Любые мысли о том, что я должен делать? –

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