Comprender las dependencias y el ensamblaje de Maven

No tengo mucha experiencia con Maven y su lógica de compilación y empaque me confunde.

Tengo algunas dependencias que declara como:

<dependency>
  <groupId>com.dependency_group</groupId>
  <artifactId>dependency_1</artifactId>
  <version>1.0.0</version>
</dependency>


<dependency>
  <groupId>com.dependency_group</groupId>
  <artifactId>dependency_2</artifactId>
  <version>1.0.0</version>
  <scope>provided</scope>
</dependency>

Por lo que yo entiendo, dependency_1se agregará al classpath de mi programa como algo que viene junto con mi jar y, dependency_2por otro lado, se agregará al classpath como algo que el tiempo de ejecución del sistema proporcionará durante la implementación.

Luego ejecuto el packageobjetivo de Maven y ninguna de mis dependencias está llena de mi código (estoy usando el shadecomplemento, pero incluso sin él, nada cambia).

Esperaba que cuando se estableciera alguna dependencia como compile scope, se exportará con mi código compilado, ya que AFAICS, no tiene sentido establecer el classpath diciendo que una dependencia vendrá junto con mi código, y Maven simplemente no empaqueta esa dependencia con él . Me parece que Maven no está obedeciendo su contrato.

Entonces:

1 - ¿Cuál es la lógica detrás de esto?

2 - ¿Debo usar siempre el complemento de ensamblaje?

3 - ¿Hay casos en los que las personas definirán una dependencia como compiley no la querrán empaquetar dentro de a jar?

Respuesta 1

Permítanme arrojar algo de luz sobre el punto principal aquí. Existen fundamentalmente dos tipos de artefactos de Java:

  1. Aplicaciones, es decir, orejas, guerras, frascos ejecutables.
  2. Bibliotecas, es decir, tarros destinados a ser utilizados como dependencias para otros artefactos.

Para las aplicaciones, su razonamiento tiene mucho sentido. Wars and Ears empaqueta automáticamente todas sus dependencias de compilación y no necesita un complemento de ensamblaje para eso. Para las bibliotecas, no empaqueta las dependencias en la biblioteca. Maven maneja la resolución de dependencia transitiva y se confundiría si coloca un tarro gordo en el classpath.

La cuestión es que el empaquetado jarpuede ser tanto una biblioteca como una aplicación. Si desea una aplicación independiente, debe decirle a Maven que empaque todo, por ejemplo, utilizando el complemento de ensamblaje o el complemento de sombreado.

Respuesta: 2

Tengo una función que devuelve los factores primos de un número, pero cuando inicializo la matriz int, configuro el tamaño, por lo que el resultado consiste en ceros innecesarios.¿Cómo puedo devolver la matriz de resultados sin ceros o cómo puedo ...

Estaba trabajando en mi proyecto de Android. Después de completar un poco de codificación, importé las clases restantes presionando ctrl + shift + o. Entonces limpié mi proyecto. Después de limpiar el proyecto, perdí mi BuildConfig ...

Quiero asignar un mensaje log4j que vaya a la consola a mi variable, por ejemplo: log.info ("alguna información"); String info = // mensaje de información del registro, ¿cómo puedo lograr esto?

Me gustaría saber qué se supone que debo hacer en el caso de una respuesta codificada con gzip. este es el método que maneja mis respuestas: privado InputStream getResultStream (respuesta de respuesta) arroja ...