Pregunta

Casi todos los proyectos Java que he visto usan Maven o Ant.Son excelentes herramientas y creo que casi cualquier proyecto puede utilizarlas.Pero ¿qué pasó con hacer?Se utiliza para una variedad de proyectos que no son Java y puede manejar Java fácilmente.Seguro que tienes que descargar make.exe si usas Windows, pero Ant y Maven tampoco vienen con el JDK.

¿Existe algún defecto fundamental en make cuando se usa con Java?¿Es sólo porque Ant y Maven están escritos en Java?

¿Fue útil?

Solución

El problema fundamental con Marca y Java es que hacen trabajos sobre la premisa de que tiene especificar una dependencia, y luego una regla para resolver esa dependencia.

Con C básica, que por lo general "para convertir un archivo a un archivo main.c main.o, ejecute "cc main.c".

Puede hacer que en java, pero aprender rápidamente algo.

Medio que el compilador javac es lento para la puesta en marcha.

La diferencia entre:

javac Main.java
javac This.java
javac That.java
javac Other.java

y

javac Main.java This.java That.java Other.java

es la noche y el día.

incrementan esa con cientos de clases, y que sólo se vuelve insostenible.

A continuación, se combina con el hecho de que Java tiende a organizarse como grupos de archivos en directorios, vs C y otros que tienden hacia una estructura más plana. Hacer no tiene mucho apoyo directo a trabajar con jerarquías de archivos.

Hacer tampoco es muy bueno en la determinación de qué archivos están fuera de fecha, a un nivel de colección.

Con Hormiga, irá a través y resumir todos los archivos que están fuera de fecha, y luego compilarlas en una sola vez. Hacer simplemente llamar al compilador Java en cada archivo individual. Tener realice no hacer esto requiere suficiente herramental externo para mostrar realmente que hacen no es del todo a la altura.

Es por eso que las alternativas como Ant y Maven se levantaron.

Otros consejos

El programa make venerable maneja compilado por separado lenguajes como C y C ++ razonablemente bien. Compila un módulo, se utiliza para tirar #include en el texto de otros archivos de inclusión, y escribe un único archivo de objeto como salida. El compilador es mucho un sistema de una en una sola vez, con una etapa de ligamiento separados para unir los archivos de objeto en un binario ejecutable.

Sin embargo, en Java, el compilador tiene que realmente compilación otras clases que se importan con import. Aunque sería posible escribir algo que genera todas las dependencias necesarias de código fuente de Java, por lo que make construiría clases en el orden correcto uno a la vez, esto todavía no se manejan casos como dependencias circulares.

El compilador de Java también puede ser más eficiente al almacenar en caché los resultados recopilados de otras clases durante la compilación de otras clases que dependen de los resultados de los ya recopilados. Este tipo de evaluación automática dependencia no es realmente posible con make solo.

La pregunta se basa en una suposición incorrecta: un número no trivial de desarrolladores hacer make uso. Ver Java construir herramientas: Ant Maven vs . En cuanto a por qué un desarrollador ¿no make uso: muchos desarrolladores o bien nunca han utilizado make, o lo han utilizado y lo odiaba con un fuego que arde con más fuerza que mil soles. Como tal, que utilizan herramientas alternativas.

En realidad, hacer que puede manejar la recopilación en un comando de todos los archivos de Java obsoletos. Cambie la primera línea si no quiere compilar todos los archivos en el directorio o desea un orden específico ...

JAVA_FILES:=$(wildcard *.java)
#
# the rest is independent of the directory
#
JAVA_CLASSES:=$(patsubst %.java,%.class,$(JAVA_FILES))

.PHONY: classes
LIST:=

classes: $(JAVA_CLASSES)
        if [ ! -z "$(LIST)" ] ; then \
                javac $(LIST) ; \
        fi

$(JAVA_CLASSES) : %.class : %.java
        $(eval LIST+=$$<)

Todas las otras respuestas acerca de los méritos técnicos de cada uno son ciertas. Ant y Maven se pueden adaptar mejor a Java que hacen, o como señala Hank Gay, que no puede:)

Sin embargo, se preguntó si importa que Ant y Maven están escritos en Java. Aunque en StackOverflow no consideramos que este tipo de pensamientos (cerrada! No-relacionados con la programación! Etc.), por supuesto que es parte de la cosa. En los carriles utilizamos Rastrillo, C tíos hacer uso, y en Java utilizamos Ant y Maven. Si bien es cierto que los desarrolladores Ant o Maven se verá después del desarrollador de Java tal vez mejor que los demás, también hay otra pregunta: ¿qué escribir en las tareas Ant? Java. Si eres un desarrollador de Java, que es un ajuste fácil.

Así que sí, parte de ella es utilizar herramientas escritas en el idioma que está utillaje.

Ant y más tarde Maven fueron diseñados para resolver algunos dolores de cabeza causados ​​por Make (mientras se crean otros nuevos en el proceso) Es solo evolución.

...Poco después, varios proyectos Java de código abierto se dieron cuenta de que Ant podía resolver los problemas que tenían con los Makefiles....

De http://ant.apache.org/faq.html#history

Si resuelven algo o simplemente crean un formato adicional para aprender es un tema subjetivo.La verdad es que esa es prácticamente la historia de cada nuevo invento:El creador dice que resuelve muchos problemas y los usuarios originales dicen que esas son virtudes.

La principal ventaja que tiene es la posibilidad de integrarse con Java.

Supongo que una historia similar sería con rake por ejemplo.

Uno de los principales problemas que resuelve Maven (e Ivy habilitado para configuraciones Ant) sobre maquillaje está automatizado resolución de dependencias y la descarga de sus tarros de dependencia.

Creo que la explicación más probable es que varios factores desalientan el uso de la marca dentro de la comunidad de Java en un período crítico de tiempo (finales de 1990):

  1. Debido Java abarca múltiples plataformas, los programadores de Java en general no eran tan expertos en herramientas Unix como lo fueron los programadores generalmente confinadas a un entorno Unix (programadores por ejemplo, C y Perl). Tenga en cuenta que esto es en general. Sin duda existen y fueron dotados los programadores de Java con un profundo conocimiento de Unix.
  2. En consecuencia eran menos expertos en maquillaje y no saben cómo utilizar con eficacia hacer.
  3. Si bien es posible escribir un Makefile corto y simple de Java que compila de manera eficiente, se requiere un cuidado extra para hacerlo de una manera independiente de la plataforma.
  4. En consecuencia hubo un apetito para una herramienta de construcción de plataforma independiente intrínsecamente.
  5. Fue en este ambiente que Ant y Maven más tarde fueron creados.

En resumen, mientras que haga con toda seguridad se puede utilizar para proyectos de Java, hubo un momento de oportunidad para que sea el hecho de Java herramienta de construcción. Ese momento ha pasado.

Crear guiones tienden a ser inherentemente plataforma dependiente. Java se supone que es independiente de la plataforma. Por tanto, tener un sistema de construcción que sólo funciona en una plataforma para un sourcebase multiplataforma está tipode un problema.

A menos que no soy nadie el supuesto nadie está (mal) uso de make para Java que está mal.

"Administración de proyectos con GNU make" (disponible bajo GFDL) contiene un capítulo completo dedicado a la utilización de make con proyectos de Java.

A medida que contiene una larga (y es de esperar justo) la lista de los pros y los contras de la utilización hacen en lugar de otras herramientas es posible que desee echar un vistazo allí. (Ver: http://oreilly.com/catalog/make3/book/ )

Short answer: Because make isn't good. Even on the C front you see many alternatives popping up.

Long answer: make has several flaws that make it barely suitable for compiling C, and unsuitable at all for compiling Java. You can force it to compile Java, if you want, but expect running into issues, some of which do not have a suitable solution or workaround. Here are a few:

Dependency resolution

make inherently expects files to have a tree-like dependency on each other, in which one file is the output of building several others. This already backfires in C when dealing with header files. make requires a make-specific include file to be generated to represent the dependency of a C file on its header files, so a change to the latter would cause the prior to be rebuilt. However, since the C file itself isn't recreated (merely rebuilt), make often requires specifying the target as .PHONY. Fortunately, GCC supports generating those files automatically.

In Java, dependency can be circular, and there's no tool for auto-generating class dependencies in make format. ant's Depend task can, instead, read the class file directly, determine which classes it imports, and delete the class file if any of them are out of date. Without this, any non-trivial dependency may result in you being forced to use repeated clean builds, removing any advantage of using a build tool.

Spaces in filenames

While neither Java nor C encourage using spaces in your source code filenames, in make this can be problem even if the spaces are in the file path. Consider, for example, if your source code exists in C:\My Documents\My Code\program\src. This would be enough to break make. This is because make treats filenames as strings. ant treats paths as special objects.

Scanning files for build

make requires explicitly setting which files are to be built for each target. ant allows specifying a folder which is to be auto-scanned for source files. It may seem like a minor convenience, but consider that in Java each new class requires a new file. Adding files to the project can become a big hassle fast.

And the biggest problem with make:

make is POSIX-dependent

Java's motto is "compile once run everywhere". But restricting that compilation to POSIX-based systems, in which Java support is actually the worst, is not the intention.

Build rules in make are essentially small bash scripts. Even though there is a port of make to Windows, for it to work properly, it has to be bundled with a port of bash, which includes a POSIX emulation layer for the file system.

This comes in two varieties:

  1. MSYS which tries to limit the POSIX translation to file paths, and can therefore have unpleasant gotchas when running external tools not made especially for it.

  2. cygwin which provides a complete POSIX emulation. The resulting programs, however, tend to still rely on that emulation layer.

For that reason, on Windows, the standard build tool isn't even make at all, but rather MSBuild, which is also an XML-based tool, closer in principle to ant.

By contrast, ant is built in Java, can run everywhere, and contains internal tools, called "tasks", for manipulating files and executing commands in a platform-independent way. It's sufficiently versatile that you can actually have an easier time building a C program in Windows using ant than using make.

And one last minor one:

Even C programs don't use make natively

You may not initially notice this, but C programs generally aren't shipped with a Makefile. They are shipped with a CMakeLists.txt, or a bash configuration script, which generates the actual Makefile. By contrast, the source of a Java program built using ant is shipped with an ant script pre-built. A Makefile is a product of other tools - That's how much make is unsuitable to be a build tool on its own. ant is standalone, and deals with everything you need for your Java build process, without any additional requirements or dependencies.

When you run ant on any platform, it Just Works(tm). You can't get that with make. It's incredibly platform and configuration dependent.

Ant is an XML configuration oriented improvement over Makefiles and Maven is a dependency build tool improvement over Ant. Some projects use all three. I think the JDK projects used to use a mix of makefiles and ant.

One big reason is that both Ant and Maven (and most java targeted SCM, CI and IDE tools) are written in java by/for java developers. This makes it simpler to integrate into your development environment and allows other tools such as the IDE and CI servers to integrate portions of the ant/maven libraries within the build/deployment infrastructure.

Once upon a time I worked on a Java project that used gmake. My recollection is hazy but IIRC we had a hard time dealing with the package directory structure that javac expects. I also remember that building JAR files was a hassle unless you had something trivial.

ApacheAnt isn't anything like Make. Make is about describing dependencies between files, and how to build files. Ant is about dependencies between "tasks", and is really more of a way of gluing build scripts together.

it may helps you AntVsMake

Ant and Maven approach the build dependency graph and the management of it from a more 'modern' view... But as Oscar says, they created their own problems while attempting to address the old problems with make.

I've never used GNU Make for Java projects, but I used to use jmk. Sadly it hasn't been updated since 2002.

It had some Java-specific functionality but was small enough to include in your source tarball without significantly increasing its size.

Nowadays I just assume any Java developer I share code with has Ant installed.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top