2015-08-24 5 views
2

Я создаю java-программу в среде Windows, но мне нужно ее скомпилировать в Linux envoirment. Я в настоящее время возникают проблемы с Makefile:Создание Makefile в Java

папки проекта организованы таким образом:

project_folder 
    library.jar 
    src 
     folder1 
     a.java 
     b.java 
     folder2 
     c.java 
     d.java 
     folder3 
     e.java 

Файл e.java в folder3 находится почти во всех остальных .java файлы, потому что это основная структура, и для каждого файла у меня есть строка

import folder3.e; 

Wich Eclipse автоматически генерируется, когда я использую структуру из другого файла класса. Что терминал говорит мне:

error: Package folder3 does not exist 

это Makefile

JFLAGS = -g -cp library.jar -sourcepath . 
JC = javac 
.SUFFIXES: .java .class 
.java.class: 
    $(JC) $(JFLAGS) $*.java 

CLASSES = \ 
    src/folder1/a.java \ 
    src/folder1/b.java \ 
    src/folder2/c.java \ 
    src/folder2/d.java \ 
    src/folder3/e.java 

default: classes 

classes: $(CLASSES:.java=.class) 

clean: 
    find . -name "*.class" -type f -delete 

Это мой самый первый Makefile для Java и я думаю, что я неправильно в том числе ссылки между классами, как я могу решить эту проблему?

Спасибо

UPDATE: @Karthikeyan Vaithilingam спасибо за подробный ответ, теперь все ясно, и работать!

+0

Системы сборки, такие как [Ant] (http://ant.apache.org/), [Maven] (http://maven.apache.org/) и [Gradle] (https://gradle.org /) были разработаны для Java, потому что 'make' не считался достаточно мощным. Поэтому, если ваш проект будет расти, вы, вероятно, захотите перейти на использование одного из них. – reinierpost

ответ

0

Добавить -d . в JFLAGS, чтобы файлы классов были созданы с правильной структурой папок.

Таким образом, ваш JFLAGS должен быть следующим.

JFLAGS = -g -cp .:library.jar -sourcepath . -d . 

-d это флаг используется для папки назначения в приведенном выше примере его текущей папке. Вы можете использовать любой пункт назначения, но не забудьте добавить его в путь к классам, используя -cp. Используя -d, вы можете сохранить исходные папки в чистоте, а очистка будет простой, просто удалите папку назначения.

Update

Проблема заключается в порядок файлов Java в CLASSES разделе. Поскольку класс folder3.e относится к другим классам, он должен быть в начале. Это должно быть похоже на нижеследующее.

CLASSES = \ 
    src/folder3/e.java \ 
    src/folder1/a.java \ 
    src/folder1/b.java \ 
    src/folder2/c.java \ 
    src/folder2/d.java 

Также вы можете сохранить библиотеки в отдельную папку, а затем использовать -cp libs\*, чтобы добавить все банки в папке.Это будет легко поддерживать

Так структура папок будет

project_folder 
    libs 
     library.jar 
    src 
     folder1 
     a.java 
     b.java 
     folder2 
     c.java 
     d.java 
     folder3 
     e.java 

И последний Makefile будет

JFLAGS = -g -cp ".:libs/*" -sourcepath . -d . 
JC = javac 


.SUFFIXES: .java .class 

.java.class: 
    $(JC) $(JFLAGS) $*.java 

CLASSES = \ 
    src/folder3/e.java \ 
    src/folder1/a.java \ 
    src/folder1/b.java \ 
    src/folder2/c.java \ 
    src/folder2/d.java 

default: classes 

classes: $(CLASSES:.java=.class) 

clean: 
    rm -r folder* 

Unrelated

Почему вы не используете сборки инструменты Gradle или Maven или Ant?

+0

Спасибо, но добавление -d не работает, я получаю те же ошибки, что и раньше – Stingi

+0

Если я использую это: JFLAGS = -g -cp library.jar -sourcepath. -d. Я получаю те же ошибки, что и раньше Если я использую именно ваше жало: JFLAGS = -g -cp.; library.jar -sourcepath. -d. Я получаю другую ошибку: «javac: no source files» use: ... .../bin/sh: 1: library.jar: не найдено – Stingi

+0

Я обновил свой ответ. –

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