Как заставить JavaC копировать существующие файлы классов в целевой каталог? - PullRequest
0 голосов
/ 27 февраля 2012

Я надеюсь, что кто-нибудь может дать мне совет ...

Проблема

В исходной директории моего проекта некоторые пакеты содержат ресурсы, которые не являются ".java"-файлы.Теперь мне нужно поместить туда скомпилированные ".class" -файлы.Проблема в том, что ANT отфильтровывает их при создании окончательного JAR-файла.Файлы ".dll" и ".png" не отфильтровываются.

Как мне добиться, чтобы все копировалось в целевой каталог?

Я использую следующую задачу Ant:

<javac srcdir="${src}" destdir="${temp}" target="1.5" encoding="8859_1" debug="${compile.withdebug}" >
  <classpath refid="libs_path" />
</javac>

Фон

Мне пришлось вставить в окончательный JAR несколько других OS-зависимых JAR (дистрибутивов SWT).Только один JAR будет загружен при запуске программы.Однако невозможно позволить JVM загружать JAR из JAR без какого-либо специального загрузчика классов.Поэтому я извлек все JAR-файлы в пакет, и JVM может загрузить их сейчас.

Почему я хочу поместить их в исходный код (в пакете Java)?Потому что я хочу сослаться на них относительно вспомогательного Java-класса:

org.example.swt_jars\
   swt_linux_32\
   swt_linux_64\
   swt_win_32\
   swt_win_64\
   SWTJarsResources.java

Спасибо!

1 Ответ

1 голос
/ 27 февраля 2012

Javac - это компилятор; заставить его перемещать файлы - значит использовать не тот инструмент для работы.

Я бы предложил просто использовать задачу Ant copy непосредственно перед или после задачи <javac> для перемещения существующих файлов классов. Что-то вроде:

<copy todir="${temp}">
    <fileset dir="${src}">
        <include name="**/*.class" />
    </fileset>
</copy>

РЕДАКТИРОВАТЬ для Eclipse: то, что вы действительно пытаетесь сделать здесь, это не Eclipse, копирующий файлы, а чтобы он распознал, что есть классы, на которые он должен ссылаться. Итак, самый простой подход, который я бы попробовал первым, - пометить каталог src как местоположение, содержащее классы , а также , содержащий источники.

Я не знаю, сработает ли это в Eclipse - например, IDEA не позволяет папке действовать как двойная цель. И опять же, похоже, что это не совсем подходящий инструмент для работы, поскольку сборка IDE просто сопоставляет двоичные файлы, необходимые для запуска приложения, а копирование файлов на основе некоторых настроек проекта кажется неправильным как-то.

В конечном счете, я не думаю, что ваш дизайн самый чистый, поэтому смешивание классов с исходными файлами может привести к путанице. Я ценю, что вы делаете это, потому что вы хотите использовать относительные ссылки, но, возможно, вам следует абстрагировать это от самой файловой системы и использовать Classloader.findResource () (или, возможно, getResourceAsStream()). Таким образом, вы можете расположить файлы так, как захотите, и до тех пор, пока вы запустите свое приложение с обоими каталогами на пути к классам, Java сможет найти нужный вам ресурс. Это даст вам больше гибкости в целом, а также разрешит эту конкретную ситуацию.

...