Как я могу использовать новый язык Xtend Eclipse в моем проекте Android?
Я хотел бы написать классы Java на языке Xtend (просто потому, что его путь более лаконичен) и скомпилировать его обратно в классы Java, которые я могу использовать в своем проекте Java. Просто как в CoffeeScript. Как я могу это сделать?
Я попытался создать файл Xtend так же, как и с новым классом, однако я получаю эту ошибку:
обязательный библиотечный комплект
'org.eclipse.xtext.xbase.lib'
не нашли в classpath.
это отключает intellisense (автозавершение.) Кроме того, даже если я получу эту работу, как я могу скомпилировать ее в класс Java?
5 ответов
попробовав то же самое, я могу подтвердить, что включение природы Xtend и добавление трех библиотек Xtend (упомянутых ранее, " org.затмение.xtext.xtend2.lib', ' org.затмение.xtext.пакете xbase.lib ' и ' com.гуглить.inject') в библиотеки проекта, по крайней мере, компилирует код Xtend. Однако у меня также возникают проблемы с классом R.
при ближайшем рассмотрении похоже, что проблема с классом R не в том, что он находится в другом каталоге. Копирование файл в основной исходный каталог с другим именем ничего не меняет. Скорее, похоже, проблема заключается в том, что класс R является статические заключительные класса, содержащие несколько статические заключительные подклассы. Если я создам простой класс-оболочку Java, который обертывает ссылку на R. layout.main (например) внутри обычного метода и вызовите это из моего кода Xtend, затем он примет его и с удовольствием компилирует.
после этого следующий вопрос, с которым я столкнулся, был компилятор Android жалуется на дубликат о.HTML и плагин.свойства файлов в орг.затмение.xtext.xtend2.lib', ' org.затмение.xtext.пакете xbase.lib ' и ' com.гуглить.впрыснуть'. Это относительно легко исправить, удалив эти файлы из двух из трех .файл jar. Я не уверен, что это сломает что-нибудь позже, но теперь, по крайней мере, у меня есть рабочий фрагмент кода Xtend, работающий на эмуляторе Android.
в Xtend внутренние классы разыменованы с помощью знака доллара ( ' $ ' ), а статические члены доступны с помощью двойного двоеточия ('::').
код активности HelloAndroid будет выглядеть следующим образом:
class XtendActivity extends Activity {
override void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R$layout::main);
}
}
Я только что получил его для компиляции, хотя пока не могу импортировать класс "R". Выполните следующие действия:
во-первых, установите Xtend SDK в Eclipse update manager, введя "http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/", развернув узел " TMF Xtext-2.1.0 "и выбрав"XTEND2 SDK". Подождите, затем перезапустите Eclipse.
В папке проекта Eclipse Android, отредактируйте файл ".проект "(например, набрав " nano .проект" в терминале на 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_FRAMEWORK, возможно, Вам тоже стоит это сделать.
назад в Eclipse, обновите проект с помощью F5, затем создайте папку "META-INF "на верхнем уровне проекта и создайте пустой файл "MANIFEST".МФ." Вставьте в него это содержимое:
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" для файлов классов.
до сих пор я не занимался разработкой Android. Но код Xtend компилируется против тонкой библиотеки времени выполнения (написанной на Java). Это в основном просто три банки: - орг.затмение.xtext.xtend2.движение за освобождение - орг.затмение.xtext.пакете xbase.движение за освобождение - com.гуглить.собирать
Они все установлены в eclipse, поэтому вы должны найти их в папке плагинов вашей установки. Мы обычно используем OSGI и PDE, чтобы иметь их на пути к классам, но это действительно просто зависимость пути к классам.
Xtend может импортируйте все, что находится на пути к классам, как Java. Он повторно использует конфигурацию проекта Java, а также инструменты разработки Java. Так что, пока у вас есть класс " R " на пути к классу, он должен работать. Пожалуйста, подайте bugzilla на bugs.eclipse.org (под Modeling/TMF / Xtext), если вы не можете ссылаться на него, хотя вы можете из Java, который находится рядом с файлом Xtend. Приведите небольшой пример и некоторые дополнительные объяснения.
вот еще один gotcha: убедитесь, что ваши имена параметров не конфликтуют ни с чем в R.java - ...
Я создал (Java) действие с помощью мастера, скопировал код, удалил действие и создал 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 на данный момент.
мне понадобилось несколько минут, чтобы понять из-за того, что параметр" menu " переопределял R. menu.activity_main. Однажды я изменил .параметр "меню" xtend для "optionsMenu", он работал нормально.