java eclipse conditional-compilation

Compilación condicional de java



eclipse conditional-compilation (10)

Soy un programador de C ++ desde hace mucho tiempo, nuevo en Java. Estoy desarrollando un proyecto Java Blackberry en Eclipse. Pregunta: ¿hay una manera de introducir diferentes conjuntos de configuración dentro del proyecto y luego compilar un código ligeramente diferente basado en esos?

En Visual Studio, tenemos configuraciones de proyectos y #ifdef; Sé que no hay #ifdef en Java, pero ¿tal vez algo en el nivel de archivo?



Además de Maven, Ant y otras herramientas de construcción que proporcionan una funcionalidad similar, uno preferiría crear interfaces en Java y cambiar las implementaciones en Runtime.
Ver el patrón de estrategia para más detalles.

En comparación con C / C ++, esto no vendrá con una gran penalidad de rendimiento, ya que el compilador JIT de Javas se optimiza en el tiempo de ejecución y puede alinear estos patrones en la mayoría de los casos.
El gran profesional de este patrón es la flexibilidad: puede cambiar la implementación subyacente sin tocar las clases principales.

También debe consultar IoC y el patrón de observador para obtener más detalles.


En JDK6, puede hacerlo utilizando la interfaz ServiceLoader de Java. Compruébalo here .


En eclipse podrias usar multiples proyectos.

  • Principal (contiene código común)
  • Versión 1 (contiene el código de la versión 1)
  • Version2 (contiene el código de version2)

    1. Principal -> Seleccione Proyecto-> Propiedades-> Ruta de compilación Java-> pestaña Proyectos
    2. Seleccione Añadir ...
    3. Agregue "Version1" xor "Version2" y OK nuevamente al área de trabajo.

La versión 1 y la versión dos contienen los mismos archivos pero diferentes implementaciones. En Main normalmente escribes por ejemplo

import org.mycustom.Version;

Y si incluyó el proyecto Version1 / Version2 como referencia, se compilará con el archivo Version.java del proyecto Version1 / Version2.


No, Java no tiene una coincidencia exacta para esa funcionalidad. Podría usar aspectos, o usar un contenedor IOC para inyectar diferentes clases de implementación.


Podría utilizar el filtrado de recursos de maven en combinación con campos finales públicos estáticos, que de hecho se compilarán condicionalmente.

private static final int MODE = ${mode}; ... if (MODE == ANDROID) { //android specific code here } else { }

Ahora necesitas agregar una propiedad a tu maven pom llamada "modo", que debería tener el mismo valor que tu constante ANDROID.

El compilador de java debería (!) Eliminar los bloques if y the else, dejando así su código de Android.

No testet, por lo que no hay garantía y preferiría la configuración en lugar de la compilación condicional.


Puede configurar los campos ''finales'' y ifs para que el compilador optimice los códigos de bytes compilados.

... public static final boolean myFinalVar=false; ... if (myFinalVar) { do something .... .... }

Si ''myFinalVar'' es falso cuando se compila el código, el bit ''hacer algo ...'' se perderá de la clase compilada. Si tiene más de una condición, esto puede ser ordenado un poco: cambie todas a otra clase (diga ''Config.myFinalVar'') y entonces las condiciones se pueden mantener en un lugar ordenado.

Este mecanismo se describe en ''Hardcore Java''.

[En realidad creo que este es el mismo mecanismo que el "ifdef del hombre pobre" publicado anteriormente.]


Puede integrar m4 en su proceso de compilación para vincular efectivamente un analógico al preprocesador de C frente al compilador de Java. En el paso de "integración", se mueve mucho a mano, pero m4 es la tecnología adecuada para el trabajo de procesamiento de texto.


Si desea esto específicamente para BlackBerry, BlackBerry JDE tiene un preprocesador :

Puede habilitar el preprocesamiento de sus aplicaciones actualizando el archivo de configuración de Eclipse ™.

En C: / Archivos de programa / Eclipse / configuration / config.ini, agregue la siguiente línea: osgi.framework.extensions = net.rim.eide.preprocessing.hook Si habilita el preproceso después de haber realizado una compilación, debe limpiar el Proyecto desde el menú Proyecto antes de volver a generar el proyecto.

Entonces puedes hacer cosas en el código como:

//#ifdef SOMETHING // do something here //#else // do something else //#endif

Para más detalles ver Especificar definiciones de preprocesador.


puede administrar diferentes classpath, por ejemplo, implementar cada ''Acción'' en un conjunto de directorios distintos:

dir1/Main.java dir2/Action.java dir3/Action.java

luego usa un classpath diferente para cada versión

javac -sourcepath dir1 -cp dir2 dir1/Main.java

o

javac -sourcepath dir1 -cp dir3 dir1/Main.java