java - para - ¿Cómo puedo usar el nuevo lenguaje Xtend de Eclipse en mi proyecto de Android?
eclipse android 2018 (5)
Acabo de compilarlo, aunque no puedo importar la clase "R", por ahora. Ejecuta estos pasos:
Primero, instale el SDK de Xtend en el administrador de actualizaciones de Eclipse ingresando "http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/", expandiendo el nodo "TMF Xtext-2.1.0", y seleccionando "Xtend2 SDK". Espera, luego reinicia Eclipse.
En su carpeta de proyectos de Eclipse para Android, edite el archivo ".project" (p. Ej. Escribiendo "nano .project" en Terminal en OSX), y cámbielo para que se parezca a esto (excepto el nombre; en realidad, puede copiar todo el contenido y cambie el nombre de nuevo a su nombre de proyecto):
<?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>
Luego inserte lo siguiente en el archivo ".classpath", dentro del elemento classpath:
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
Lo puse antes de la entrada con com.android.ide.eclipse.adt.ANDROID_FRAMEWORK, tal vez debería hacerlo también.
De vuelta en Eclipse, actualice el proyecto con F5, luego cree una carpeta "META-INF" en el nivel superior del proyecto y cree un archivo vacío "MANIFEST.MF". Pegue en ella estos contenidos:
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"
Realice un "Proyecto" -> "Limpiar" en su proyecto, y ahora puede crear y usar clases Xtend.
Como se mencionó anteriormente, no puedo importar la clase R, quizás Xtend simplemente busque archivos de clase en la carpeta "src" normal.
Me gustaría escribir clases de Java en el lenguaje Xtend (simplemente porque es más conciso), y compilarlas en clases de Java que pueda usar en mi proyecto Java. Al igual que coffeescript. ¿Cómo puedo hacer esto?
Intenté crear un archivo Xtend tal como lo haría con una nueva clase, sin embargo recibo este error:
El paquete de biblioteca obligatorio
''org.eclipse.xtext.xbase.lib''
no se encuentra en la ruta de clase.
Esto deshabilita la inteligencia (autocompletado). Además, incluso si lo hago funcionar, ¿cómo puedo compilarlo en una clase de Java?
Aquí hay otra pregunta: Asegúrese de que los nombres de sus parámetros no entren en conflicto con nada en R.java.
Creé una actividad (Java) usando el asistente, copié el código, borré la actividad y creé un MainActivity.xtend en su lugar, de esta manera:
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;
}
Se ve bien en el archivo .xtend, pero no se genera porque el código Java generado
public boolean onCreateOptionsMenu(final Menu menu) {
MenuInflater _menuInflater = this.getMenuInflater();
_menuInflater.inflate(menu.activity_main, menu);
return true;
}
no le gusta activity_main en este punto.
Me tomó unos minutos darme cuenta de que el parámetro "menú" estaba reemplazando a R.menu.activity_main. Una vez que cambié el parámetro "menú" de .xtend a "menú de opciones", funcionó bien.
En Xtend, las clases internas se anulan mediante un signo de dólar (''$'') y se accede a los miembros estáticos con dos puntos dobles (''::'').
El código de actividad de HelloAndroid se vería así:
class XtendActivity extends Activity {
override void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R$layout::main);
}
}
Habiendo intentado lo mismo, puedo confirmar que habilite Xtend Nature y agregue las tres bibliotecas Xtend (mencionadas anteriormente, ''org.eclipse.xtext.xtend2.lib'', ''org.eclipse.xtext.xbase.lib'' y ''com .google.inject '') a las bibliotecas del proyecto hace que el código Xtend se compile, al menos. Sin embargo, también estoy teniendo problemas con la clase R.
En una inspección más cercana, parece que el problema con la clase R no es que se encuentre en un directorio diferente. Copiar el archivo al directorio fuente principal con un nombre diferente no cambia nada. Más bien, parece que el problema es que la clase R es una clase final estática , que contiene varias subclases estáticas finales . Si creo una simple clase de envoltura Java simple que envuelve una referencia a R.layout.main (por ejemplo) dentro de un método normal, y la llamo desde mi código Xtend, entonces la acepta y compila alegremente.
Después de eso, el siguiente problema que encontré fue el compilador de Android quejándose de los archivos duplicados de about.html y plugin.properties en ''org.eclipse.xtext.xtend2.lib'', ''org.eclipse.xtext.xbase.lib'' y '' com.google.inject ''. Esto es relativamente fácil de arreglar, eliminando esos archivos de dos de los tres archivos .jar. No estoy seguro de si se rompe algo más adelante, pero ahora al menos tengo un fragmento de código de Xtend funcionando en el emulador de Android.
No he hecho ningún desarrollo de Android hasta ahora. Pero el código Xtend se compila contra una biblioteca de tiempo de ejecución delgada (escrita en Java). Son principalmente tres frascos: - org.eclipse.xtext.xtend2.lib - org.eclipse.xtext.xbase.lib - com.google.collect
Todos están instalados en eclipse, por lo que debe encontrarlos en la carpeta de complementos de su instalación. Usualmente usamos OSGI y PDE para tenerlos en el classpath, pero en realidad es solo una dependencia del classpath.
Xtend puede importar todo lo que está en la ruta de clase al igual que Java. Reutiliza la configuración del proyecto Java y también las herramientas de desarrollo de Java. Entonces, siempre que tenga la clase "R" en la ruta de clases, debería funcionar. Por favor, envíe un bugzilla en bugs.eclipse.org (bajo Modelado / TMF / Xtext) Si no puede hacer referencia a él aunque puede hacerlo desde un Java que se encuentra al lado del archivo Xtend. Y proporcione un pequeño ejemplo y alguna explicación adicional.