Módulo de compilación que depende de un tarro externa

JoshuaD:

He trabajado a través de un ejemplo sencillo mediante Project Jigsaw en Java 11.0.1, construido utilizando el oráculo JDK 11 en Ubuntu 18.04.

Siguiendo ese ejemplo, he creado un proyecto simple que compila a un módulo, el módulo de paquetes en un frasco, y luego se utiliza jlinkpara crear una distribución independiente. Todo funciona - el resultado final es una carpeta con una pequeña simplificada JRE y mi módulo.

El proyecto se compone de sólo tres archivos y algunas carpetas:

.:
build.sh  src

./src:
com  module-info.java

./src/com:
greetings

./src/com/greetings:
Main.java

src / com / saludos / Main.java

package com.greetings;

public class Main {
   public static void main(String[] args) {
      System.out.println("Greetings!");
   }
}

src / module-info.java

module com.greetings { }

build.sh

#/bin/bash

#clean up from last build
rm -rf greetingsapp mlib mods

#compile
javac -d mods/com.greetings src/module-info.java src/com/greetings/Main.java

#Make module jar
mkdir mlib
jar --create --file=mlib/com.greetings.jar --main-class=com.greetings.Main -C mods/com.greetings .

#build distribution
jlink --module-path /usr/lib/jvm/java-11-oracle/jmods/:mlib --add-modules com.greetings --output greetingsapp --strip-debug --no-header-files --no-man-pages --launcher greetings=com.greetings

#run
greetingsapp/bin/greetings

Todo eso funciona. Ahora aquí está el problema:

La siguiente cosa que quiero hacer es utilizar una biblioteca externa, por lo que añade unas líneas para Main.java:

Main.java - Actualizado

package com.greetings;

import org.apache.commons.cli.CommandLine; //new line

public class Main {

   CommandLine line; //new line

   public static void main(String[] args) {
      System.out.println("Greetings!");
   }
}

Entonces coloqué Commons-cli-1.4.jar en un nuevo directorio llamado lib.

Que creó esta estructura de archivos:

.:
build.sh  lib  src

./lib:
commons-cli-1.4.jar

./src:
com  module-info.java

./src/com:
greetings

./src/com/greetings:
Main.java

He modificado la línea de compilación para incluir el tarro de los Comunes en la ruta de clase:

javac -cp lib/commons-cli-1.4.jar:. \
-d mods/com.greetings \
src/module-info.java src/com/greetings/Main.java

Sin embargo, cuando intento compilar, me sale este error:

src/com/greetings/Main.java:10: error: package org.apache.commons.cli is not visible
import org.apache.commons.cli.CommandLine;
                     ^
   (package org.apache.commons.cli is declared in the unnamed module, but module org.apache.commons.cli does not read it)
1 error

¿Cómo modifico mi proyecto para que pueda compilar contra Commons-cli-1.4.jar ?


Editar, por sugerencia de la NullPointer usuario, he intentado cambiar la bandera -cp a sólo un distintivo -p, por lo que se añade el frasco externo a la ruta del módulo en su lugar. Por desgracia, eso tampoco funciona. Éstos son los diversos comandos javac He intentado que tampoco hacer el trabajo:

javac -p lib -d mods/com.greetings \
src/module-info.java src/com/greetings/Main.java

javac --module-path=lib -d mods/com.greetings \
src/module-info.java src/com/greetings/Main.java

javac -p lib/commons-cli-1.4.jar -d mods/com.greetings \
src/module-info.java src/com/greetings/Main.java
también:

Que ha colocado el tarro en la ruta de clase debido a lo cual se traduce en un módulo sin nombre. .

El módulo no identificado exporta todos sus paquetes . ...

No lo hace, sin embargo, que el código en un módulo llamado puede acceder a los tipos en el módulo sin nombre. ...

Esta restricción es intencional, ya que permite a los módulos mencionados dependen del contenido arbitrario de la ruta de clase haría configuración fiable imposible.

En lugar de tratar de colocar el mismo tarro en la modulepath desde donde se puede inferir como un módulo automático .


También tendría que asegurarse de que la declaración de módulo de su módulo se actualiza en consecuencia para definir una dependencia en el módulo recién agregado para acceder a sus paquetes exportados.

module com.greetings { 
    requires commons.cli;
}

Editar : Probando la completa build.sh en su caso todavía fallar, pero en el paso que une , debido a la presencia de un módulo automático .

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=181902&siteId=1
Recomendado
Clasificación