Как я могу использовать новый Xtend-язык Eclipse в своем проекте Android?

Я бы хотел написать Java-классы на языке Xtend (просто потому, что он стал более сложным) и скомпилировать его обратно в классы Java, которые я могу использовать в своем проекте Java. Так же, как кофейник. Как я могу это сделать?

Я попытался создать файл Xtend так же, как и с новым классом, однако я получаю эту ошибку:

Обязательный библиотечный пакет 'org.eclipse.xtext.xbase.lib' не найден в пути к классам.

Это отключает intellisense (автозаполнение). Кроме того, даже если я получу эту работу, как я могу ее скомпилировать для класса Java?

Solutions Collecting From Web of "Как я могу использовать новый Xtend-язык Eclipse в своем проекте Android?"

Пробовав то же самое, я могу подтвердить, что включение 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.

В Xtend внутренние классы разыменовываются с использованием знака доллара ('$'), а для доступа к статическим членам используется двойной двоеточие ('::').

Код активности HelloAndroid будет выглядеть так:

 class XtendActivity extends Activity { override void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R$layout::main); } } 

Я просто получил его для компиляции, хотя я не могу импортировать класс «R», пока. Выполните следующие действия:

Во-первых, установите Xtend SDK в диспетчере обновлений Eclipse, введя «http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/», расширяющий узел «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» в элементе pathpath:

 <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» для файлов классов.

До сих пор я не занимался разработкой 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. И дайте небольшой пример и некоторое дополнительное объяснение.

Вот еще один вопрос: убедитесь, что имена параметров не конфликтуют ни с чем в 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. Как только я изменил параметр «меню» .xtend на «optionsMenu», он работал нормально.