Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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", он работал нормально.