java - tutorial - pom.xml que es




Crear un subconjunto de un proyecto Java Eclipse basado en dependencias de un archivo fuente (4)

Actualmente está copiando suficientes archivos de clase para hacer feliz al compilador . Sin embargo, ¿está seguro de que está copiando suficientes archivos de clase para hacer feliz a la aplicación en ejecución ? Algunas aplicaciones cargan sus clases a través de la reflexión en tiempo de ejecución:

String className = "org.my.company.Foo";
Class<?> fooClass = Class.forName(className);
Object foo = fooClass.newInstance();

En este ejemplo, el compilador no se quejará, incluso si no copia la clase org.my.company.Foo . Sin embargo, la aplicación en ejecución ciertamente se quejará cuando no pueda encontrar la clase.

Si desea acomodar ambas situaciones, puede intentar escribir un ClassLoader personalizado que registre todas las clases cargadas por la aplicación en ejecución:

public class RecordingClassLoader extends ClassLoader {

    private FileWriter classNameWriter;

    public RecordingClassLoader(ClassLoader parent) throws IOException {
        super(parent);
        classNameWriter = new FileWriter(System.getProperty("loaded.classes.file", "C:\\classes.txt"));
    }

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        try {
            classNameWriter.write(name);
            classNameWriter.write("\r\n");
            classNameWriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("Could not record class loading", e);
        }

        return super.loadClass(name);
    }

}

Entonces podría ejecutar su aplicación de esta manera:

java
  -Djava.system.class.loader=RecordingClassLoader
  -Dloaded.classes.file=loaded_classes.txt
  YourApplication

El archivo loaded_classes.txt se verá más o menos así:

java.lang.System
java.nio.charset.Charset
java.lang.String
...
...
YourApplication

Puede modificar el cargador de clases para ignorar cualquier clase que se esté cargando desde el java. paquetes. Después de ejecutar la aplicación, puede hacer que un pequeño programa copie automáticamente las clases mencionadas en este archivo.

Tengo una biblioteca de proyecto Eclipse / espacio de trabajo que contiene la funcionalidad que ocasionalmente se entrega a un cliente. Todos somos investigadores, así que esto se hace de manera muy informal; Hago un JAR y un archivo Word con documentación, y se lo envío.

Prefiero enviarles un archivo JAR que solo contenga lo que realmente necesitan, para simplificar las cosas. Si necesitan las clases X, Y, Z y W, entonces envío un archivo JAR que contiene X, Y, Z y W, así como todas las clases de las que dependen.

En este momento estoy haciendo esto de una manera irremediablemente manual (creo un nuevo proyecto, arrastro sobre X, Y, Z y W, y luego arrastro todo lo que necesito para corregir los errores del compilador). ¿Cuál es la forma correcta de automatizarlo en Eclipse?

EDITAR: solo para que quede claro, los proyectos de Eclipse involucrados contienen muchas más clases de las que realmente necesita el cliente.

EDITAR: Además, no hay reflexión involucrada; Puedo estar seguro de que el compilador sabe lo que está pasando. Yo soy el que escribió el código y evito la reflexión como la peste. El único lugar en el que utilicé la reflexión es imitar Collections.toArray (), y en ese caso la única clase que podría causar un problema es la que el usuario proporcionó.


Cuando utiliza el comando Exportar, tiene la opción de elegir qué archivos incluir en el JAR generado.


Byecycle, un plugin de Eclipse ayudaría, pero ha sido eliminado de Sourceforge. No al obtener un proceso automatizado exhaustivo, sino al determinar las dependencias. No estoy seguro de si puede hacer que funcione en Ganimedes / Galileo, ya que lo he usado hace mucho tiempo.

Actualizar

La herramienta del analizador de dependencias de clase podría ser más útil, ya que viene con una API de extensión de complemento que podría usarse para crear un complemento para realizar exactamente la tarea que tiene la intención de hacer.

Actualización # 2

En caso de que se esté preguntando sobre el uso de Ant, puede usar el tipo ClassFileSet para obtener una clase y su lista de dependencias. Se puede hacer referencia a esto dentro de una tarea de copia para copiar los archivos de clase requeridos. Tenga en cuenta que esto no copia los archivos fuente.

Internamente, este método depende de la biblioteca BCEL , por lo que si desea realizar una copia de las fuentes, podría intentar escribir un código para examinar las dependencias de un archivo .class y copiar las fuentes en otro directorio.


Envié una solicitud de mejora de Eclipse para admitir dicha refactorización. Mientras tanto, encontré algunas herramientas prometedoras para ayudar con el desacoplamiento y el análisis de dependencia.

  • eDepend es un complemento de visor de dependencias que incluye un diagrama de dependencia de clase / paquete que muestra dependencias de elementos, relaciones con bibliotecas / otros proyectos y ciclos de dependencia. También puede enumerar las clases que causaron las dependencias.
  • Análisis de estructura STAN para Java
  • nWire
  • Analizador de Dependencia de Clase
  • Buscador de dependencia

Preguntas relacionadas: 1





dependencies