Eu criei dois programas modulares. Um deles é projeto modular JavaFX que contém module-info.java
como:
module checker {
requires javafx.fxml;
requires javafx.controls;
requires TextInputProgram; // Btw, IDEA shows me here "Ambiguous module reference"
exports sample;
opens sample;
}
Outro projeto Maven que contém module-info.java
como:
module TextInputProgram {
requires selenium.api;
requires selenium.chrome.driver;
}
Então, eu adicionei projeto Maven modular como jar externo em JavaFX (via estrutura do projeto no libs e no módulo-info via requires
I especificado jar). Também I adicionado variável que contém frasco externo para a compilação (para além de PATH_TO_FX
e PATH_TO_FX_MODS
):
set EXTERNAL_JAR="...\out\artifacts\TextInputProgram_jar"
Mas quando eu estou tentando compilar o projeto através do comando:
dir /s /b src\*.java > sources.txt & javac --module-path %EXTERNAL_JAR%;%PATH_TO_FX% -d mods/checker @sources.txt & del sources.txt
seguir este tutorial
Eu estou recebendo a partir de JavaFX classe projeto o erro:
\src\sample\Controller.java:9: error: package project is not visible
import project.SeleniumProgram;
^
(package project is declared in module TextInputProgram, which does not export it)
1 error
Package is declared in module which does not export it
import project.SeleniumProgram
Eu importados no projeto JavaFX usar classes de jar externo.
Atualizada:
Se eu adicionar exports project;
module-info.java interior do projeto maven então eu vejo o erro no JavaFX module-info.java:
Se eu excluir
requires TextInputProgram;
, em seguida, eu tenho um outro erro de importação:
Estou faltando alguma coisa aqui? Eu estou tentando obter Jar executável destes dois programas.
Como discutido ao longo dos comentários, há algumas possíveis problemas aqui:
definição de módulo
frascos e dependências locais
Com base nos projetos modulares postados, eu vou criar um pequeno projeto multi-modular de demonstração para explicar ambos os problemas.
Maven projeto multi-modular
Usando seu IDE, crie um projeto Maven, em seguida, adicionar dois módulos, TextInputProgram
e checker
, como:
pom pai
<groupId>org.openjfx</groupId>
<artifactId>hellofx</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>TextInputProgram</module>
<module>checker</module>
</modules>
<packaging>pom</packaging>
TextInputProgram pom
<parent>
<groupId>org.openjfx</groupId>
<artifactId>hellofx</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>TextInputProgram</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
Module-info.java
module TextInputProgram {
requires selenium.api;
requires selenium.chrome.driver;
exports project to checker;
}
Checker pom
<parent>
<artifactId>testMods</artifactId>
<groupId>org.openjfx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>checker</artifactId>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>12.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>12.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>TextInputProgram</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.3</version>
<configuration>
<mainClass>sample.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
Module-info.java
module checker {
requires javafx.fxml;
requires javafx.controls;
requires TextInputProgram;
opens sample to javafx.fxml;
exports sample;
}
(Código de ambos os módulos é irrelevante neste momento).
soluções incluído
Agora note que você tem que adicionar isso no TextInputProgram
descritor de módulo:
exports project to checker;
Se você quer deixar checker
módulo para acesso TextInputProgram
é project
pacote.
Isto irá resolver este erro:
projeto pacote é declarado em TextInputProgram módulo, que não exportá-lo
Além disso, note que eu incluí esta dependência no checker
projeto:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>TextInputProgram</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
Mesmo tendo dois módulos, sob o mesmo pai, você precisa incluir a dependência de um módulo para o outro. Caso contrário, este irá falhar (módulo não encontrado):
requires TextInputProgram;
Você pode executar mvn clean install
no TextInputProgram
módulo, para instalar org.openjfx:TextInputProgram:1.0-SNAPSHOT
em seu repositório local .m2
.
Em seguida, você pode executar mvn clean javafx:run
int a checker module
, para executar o projeto GUI.
Vale ressaltar que não é uma boa idéia para combinar as duas dependências Maven com arquivos jar. Se você acabar usando ambos, você irá obter este erro:
'Verificador' módulo lê 'projecto' de ambos 'TextInputProgram' e 'TextInputProgram'
Esta mensagem significa que existem dois módulos no caminho do módulo com o mesmo nome, um a dependência Maven, o outro, o artefato JAR.
A fim de distribuir o seu projeto e módulos, é melhor usar a abordagem maven, e arquivos jar evitar ter em pastas lib. Mais tarde, os módulos serão publicados como artefatos separados, e você não precisará modificar seus arquivos pom (exceto para atualizar os números de versão).