Как я могу использовать новый язык Xtend Eclipse в своем проекте Android?
Я хотел бы написать классы Java на языке Xtend (просто потому, что его путь более краткий) и скомпилировать его обратно в классы Java, которые я могу использовать в своем проекте Java. Так же, как кофейник. Как я могу это сделать?
Я попытался создать файл Xtend так же, как и с новым классом, однако я получаю эту ошибку:
Обязательный набор библиотек 'org.eclipse.xtext.xbase.lib'
не найден в пути к классам.
Это отключает intellisense (автозаполнение). Кроме того, даже если я получаю эту работу, как я могу ее скомпилировать для класса Java?
Ответы
Ответ 1
Пробовав то же самое, я могу подтвердить, что включение Xtend Nature и добавление трех библиотек Xtend (упомянутых ранее, "org.eclipse.xtext.xtend2.lib", "org.eclipse.xtext.xbase.lib" и "com.google.inject" ) в библиотеки проектов заставляет компилировать код Xtend, по крайней мере. Однако у меня также возникают проблемы с классом R.
При ближайшем рассмотрении похоже, что проблема с классом R заключается не в том, что он находится в другом каталоге. Копирование файла в главный источник с другим именем ничего не меняет. Скорее, похоже, что проблема заключается в том, что класс R является статическим окончательным классом, содержащим несколько статических конечных подклассов. Если я создаю простой класс оболочки Java-оболочки, который обертывает ссылку на R.layout.main(например) внутри обычного метода и вызывает это из моего кода Xtend, то он принимает его и с радостью компилирует.
После этого следующей проблемой, с которой я столкнулся, был компилятор Android, жалующийся на дубликаты файлов about.html и plugin.properties в 'org.eclipse.xtext.xtend2.lib', 'org.eclipse.xtext.xbase.lib 'и' com.google.inject '. Это относительно легко исправить, удалив эти файлы из двух из трех файлов .jar. Я не уверен, что это сломает что-нибудь позже, но теперь, по крайней мере, у меня есть рабочий фрагмент кода Xtend, запущенного на эмуляторе Android.
Ответ 2
В Xtend внутренние классы разыменовываются с использованием знака доллара ('$'), а для доступа к статическим элементам используется двойной двоеточие ('::').
Код активности HelloAndroid будет выглядеть следующим образом:
class XtendActivity extends Activity {
override void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R$layout::main);
}
}
Ответ 3
Я просто получил его для компиляции, хотя пока не могу импортировать класс "R".
Выполните следующие шаги:
Сначала установите Xtend SDK в диспетчере обновлений Eclipse, введя "http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/", расширяя node "TMF Xtext- 2.1.0" и выбрав "Xtend2 SDK". Подождите, а затем перезапустите Eclipse.
В папке проекта Eclipse Android отредактируйте файл ".project" (например, набрав "nano.project" в Terminal on OSX) и измените его так, чтобы он был похож на него (кроме имени; вы можете фактически скопировать весь контент и измените имя на название проекта):
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>TestAndroidXtend</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
</natures>
Затем добавьте следующее в файл ".classpath" в элементе classpath:
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
Я положил его перед записью с com.android.ide.eclipse.adt.ANDROID_FRAMEWORK, возможно, вы тоже должны это сделать.
Вернемся в Eclipse, обновите проект с помощью F5, затем создайте папку "META-INF" на уровне проекта и создайте пустой файл "MANIFEST.MF". Вставьте в это содержимое:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Xtend Tutorial
Bundle-SymbolicName: xtend.tutorial
Bundle-Version: 2.1.0.qualifier
Bundle-Vendor: Eclipse Modeling
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Require-Bundle: org.eclipse.xtext.xtend2.lib;bundle-version="2.0.0",
org.junit4,
org.aopalliance;bundle-version="1.0.0"
Выполните "Проект" → "Очистить" в своем проекте, и теперь вы можете создавать и использовать классы Xtend.
Как уже упоминалось ранее, я не могу импортировать R-класс, возможно, Xtend просто смотрит в обычную папку "src" для файлов классов.
Ответ 4
Я пока не разрабатывал Android. Но код Xtend скомпилирован против тонкой библиотеки времени выполнения (написанной на Java). Это в основном только три банки:
- org.eclipse.xtext.xtend2.lib
- org.eclipse.xtext.xbase.lib
- com.google.collect
Все они установлены в eclipse, поэтому вы должны найти их в папке плагинов вашей установки. Обычно мы используем OSGI и PDE, чтобы иметь их в пути к классам, но на самом деле это просто зависимость от classpath.
Xtend может импортировать все, что находится в пути к классам, подобно Java. Он повторно использует конфигурацию Java-проекта, а также инструменты разработки Java. Поэтому, пока у вас есть класс "R" на пути к классу, он должен работать. Пожалуйста, напишите bugzilla на bugs.eclipse.org(в разделе Modeling/TMF/Xtext). Если вы не можете ссылаться на него, хотя вы можете использовать Java, который находится рядом с файлом Xtend. И дайте небольшой пример и некоторое дополнительное объяснение.
Ответ 5
Здесь еще есть: Убедитесь, что имена параметров не конфликтуют ни с чем в R.java.
Я создал (Java) активность с помощью мастера, скопировал код, удалил Activity и создал на нем MainActivity.xtend так:
public class MainActivity extends Activity {
override void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R$layout::activity_main);
}
override boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R$menu::activity_main, menu);
return true;
}
Он отлично выглядит в файле .xtend, но он не создается, потому что сгенерированный Java-код
public boolean onCreateOptionsMenu(final Menu menu) {
MenuInflater _menuInflater = this.getMenuInflater();
_menuInflater.inflate(menu.activity_main, menu);
return true;
}
в данный момент не нравится activity_main.
Мне потребовалось несколько минут, чтобы понять, что параметр "меню" переопределяет R.menu.activity_main.
Как только я изменил параметр "menu".xtend на "optionsMenu", он работал нормально.