Hope all doing well.
Today I was working on multi-module gradle project, and trying to publish one of it's dependency to artifactory as well.
my project structure are:
build.gradle (main)
buildscript {
ext {
appVersion = "0.0.2-RC3"
appBuildCode = 2
// dependencies version
springVersion = "2.6.0"
swaggerApiVersion = "1.5.12"
jjwtVersion = "0.11.2"
lombokVersion = "1.18.22"
// firebase versions
firebaseAdminVersion = "8.1.0"
}
repositories {
mavenCentral()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:$springVersion")
classpath("org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.2.0")
classpath("io.spring.gradle:dependency-management-plugin:1.0.11.RELEASE")
classpath("org.jfrog.buildinfo:build-info-extractor-gradle:latest.release")
}
}
apply(plugin: "org.sonarqube")
apply(plugin: "jacoco")
allprojects {
apply(plugin: 'java')
apply(plugin: 'org.springframework.boot')
apply(plugin: 'io.spring.dependency-management')
group 'com.example'
repositories {
mavenCentral()
maven {
url "${artifactory_contextUrl}/libs-release/"
allowInsecureProtocol true
}
}
configurations {
all*.exclude module: 'spring-boot-starter-logging'
}
dependencies {
....
}
}
build.gradle (api)
plugins {
id 'java-library'
id 'maven-publish'
id 'com.jfrog.artifactory'
}
version "${appVersion}"
artifactory {
contextUrl = artifactory_contextUrl
publish {
contextUrl = artifactory_contextUrl
repository {
repoKey = artifactory_repoKey
username = artifactory_user
password = artifactory_password
}
defaults {
publishConfigs('published')
publishIvy = false
publications("mavenJava")
}
}
}
//jar {
////// archiveName 'admin-api.jar'
////// manifest{
////// attributes ("Fw-Version" : "2.50.00", "${parent.manifestSectionName}")
////// }
////// baseName 'admin-api'
//// archivesBaseName = "$archivesBaseName"
//
// from {
// configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
// }
//}
task sourcesJar(type: Jar, dependsOn: classes) {
// classifier = 'sources'
from sourceSets.main.allSource
}
artifacts {
archives sourcesJar
}
publishing {
publications {
mavenJava(MavenPublication) {
from(components.java)
// artifactId = 'admin-api'
artifact(sourcesJar) {
classifier 'sources'
}
}
}
}
task dist(type: Zip, dependsOn: build) {
classifier = 'buildreport'
from('build/test-results') {
include '*.xml'
into 'tests'
}
from('build/reports/codenarc') {
into 'reports'
}
from('build/docs') {
into 'api'
}
from(sourcesJar) {
into 'source'
}
from('build/libs') {
exclude '*-sources.jar'
into 'bin'
}
}
//artifactoryPublish.dependsOn('clean', 'build', 'groovydoc', 'sourcesJar', 'dist')
//publish.dependsOn(artifactoryPublish)
and the task artifactoryPublish produces:
> Task :admin-api:extractModuleInfo
[pool-7-thread-1] Deploying artifact: http://10.0.0.3:8081/artifactory/libs-release-local/com/example/admin-api/0.0.2-RC3/admin-api-0.0.2-RC3-plain.jar
[pool-7-thread-1] Deploying artifact: http://10.0.0.3:8081/artifactory/libs-release-local/com/example/admin-api/0.0.2-RC3/admin-api-0.0.2-RC3.module
[pool-7-thread-1] Deploying artifact: http://10.0.0.3:8081/artifactory/libs-release-local/com/example/admin-api/0.0.2-RC3/admin-api-0.0.2-RC3.pom
> Task :artifactoryDeploy
Now the issue is that,
the modules, like admin-api builds with the name admin-api-0.0.2-RC3-plain.jar, and the resolution of dependency fails in another project, from which this API needs to be used by reporting following issue:
Could not resolve com.example.admin-api:0.0.2-RC3.
Required by:
project :admin-api
Possible solution:
- Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
gradle dependency statement:
dependencies {
compileOnly('com.example:admin-api:0.0.2-RC3')
}
Please assist me on what is going wrong here.
Also, is their any way so that the modules jar builds without the suffix -plain?
Thanks in advance:)
Hi finally I've achieved this using the following configurations:
allprojects {
....
bootJar {
enabled = false
}
jar {
archiveClassifier.convention('')
archiveClassifier.set('')
}
....
}
Related
I am beating against a wall for a whole week. I can't really see the reason why it doesn't work. I have a project where I want to run my Java project with the following build.gradle config:
plugins {
id 'java'
id 'org.springframework.boot' version '2.6.3'
id("io.spring.dependency-management") version "1.0.11.RELEASE"
id 'org.web3j' version "4.8.4"
}
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
mavenCentral()
jcenter()
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
group = 'com.suplab'
sourceSets {
main {
solidity {
srcDir "contracts"
}
}
test {
solidity {
srcDir "contracts"
}
}
}
ext {
web3jVersion = '4.8.4'
}
npmInstall {
enabled false
}
dependencies {
implementation "org.web3j:core:$web3jVersion"
implementation "org.web3j:web3j-evm:$web3jVersion"
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.hibernate:hibernate-core:5.6.5.Final'
}
I use gradle version 6.8, since it was specified by developer of the plugin. When I try to build this project from the parent, root folder that is the root of the project, it fails with following error:
A problem occurred configuring project ':api'.
> Failed to notify project evaluation listener.
> Task with name 'resolveSolidity' not found in project ':api'.
> Could not create task ':api:generateTestContractWrappers'.
> Task with name 'compileTestSolidity' not found in project ':api'.
I can't figure it out. I checked it against the build that being generated with web3j-cli, and it's the same for the configuration property (both configs have it blank). So, I don't see any reason WHY it fails. Here's the webj3-cli generated build file:
plugins {
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.3.61'
id 'application'
id "com.github.johnrengelman.shadow" version "5.2.0"
id 'org.web3j' version '4.8.4'
}
group 'org.web3j'
version '0.1.0'
sourceCompatibility = 1.8
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
mavenCentral()
jcenter()
}
web3j {
generatedPackageName = 'org.web3j.generated.contracts'
excludedContracts = ['Mortal']
}
ext {
web3jVersion = '4.8.4'
logbackVersion = '1.2.3'
}
dependencies {
implementation "org.web3j:core:$web3jVersion",
"ch.qos.logback:logback-core:$logbackVersion",
"ch.qos.logback:logback-classic:$logbackVersion"
implementation "org.web3j:web3j-unit:$web3jVersion"
implementation "org.web3j:web3j-evm:$web3jVersion"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}
jar {
manifest {
attributes(
'Main-Class': 'org.web3j.Web3App',
'Multi-Release':'true'
)
}
}
application {
mainClassName = 'org.web3j.Web3App'
}
test {
useJUnitPlatform()
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
I am trying to build my Java 11 project to have either an executable jar (FatJar, SuperJar, whatever its called) or an EXE or any form of runnable version even a batch file (Using Application). Everything I try I either get JavaFX is missing or my dependencies included the packages arent visible and it error's out.
Here is my build.gradle
plugins {
id 'application'
id 'java'
id 'maven-publish'
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'edu.sc.seis.launch4j' version '2.4.6'
id 'org.beryx.jlink' version '2.12.0'
}
application {
mainClassName = 'sassa.sassa.Main'
}
repositories {
mavenLocal()
maven {
url = uri('https://jitpack.io')
}
maven {
url = uri('https://repo.maven.apache.org/maven2')
}
}
javafx {
version = "11.0.2"
modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.graphics' ]
}
jlink {
launcher {
name = 'sassa'
}
}
dependencies {
implementation 'com.github.toolbox4minecraft:amidst:v4.4-beta1'
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
}
jar {
manifest {
attributes("Manifest-Version": "1.0",
"Main-Class": "sassa.main.Main");
}
}
compileJava {
doFirst {
println "CLASSPATH IS $classpath.asPath"
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.graphics',
'--add-modules', 'javafx.controls',
'--add-modules', 'javafx.fxml'
]
classpath = files()
}
}
task fatJar(type: Jar) {
manifest.from jar.manifest
classifier = 'all'
from {
configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
} {
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
with jar
}
launch4j {
mainClassName = 'sassa.main.Main'
icon = "${projectDir}/src/main/resources/sassa/sassa.ico"
jreMinVersion = '11'
jreMaxVersion = '14'
jdkPreference = 'preferJre'
initialHeapSize = 128
maxHeapSize = 512
stayAlive = false
bundledJre64Bit = true
dontWrapJar = true
bundledJrePath = 'jre'
}
group = 'sassa'
version = '0.5.0'
sourceCompatibility = '11'
publishing {
publications {
maven(MavenPublication) {
from(components.java)
}
}
}
Also for the layout of the project it is on github (I was using maven before but figured Gradle might work better. (The maven code is still on github) https://github.com/Zodsmar/SeedSearcherStandaloneTool/tree/development
Literally I have tried everything and I just can't seem to get a buildable version to distribute...
Also I have read up about module.info files I do not have any I want to have a simple build.gradle that just includes everything I need to build an executable.
To anyone whoever comes across this and wants to know how I fixed it. I created a Gradle build task and then was able to build Jars, EXEs, Tar, and Zip this is the gradle:
plugins {
id 'application'
id 'java'
id 'maven-publish'
id 'org.openjfx.javafxplugin' version '0.0.8'
id 'edu.sc.seis.launch4j' version '2.4.6'
}
dependencies {
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
implementation ('com.github.KaptainWutax:BiomeUtils:master-SNAPSHOT') {
transitive = false;
changing = true;
}
implementation ('com.github.KaptainWutax:FeatureUtils:master-SNAPSHOT')
{
transitive = false;
changing = true;
}
implementation ('com.github.KaptainWutax:SeedUtils:master-SNAPSHOT')
{
transitive = false;
changing = true;
}
}
group = 'sassa'
version = 'v0.6.0'
sourceCompatibility = '1.8'
String stringVersion = version
javafx {
version = "11.0.2"
modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.graphics' ]
}
application {
mainClassName = 'sassa.main.Main'
}
jar {
manifest {
attributes 'Main-Class': 'sassa.main.Main'
}
from {
configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
launch4j {
mainClassName = 'sassa.main.Main'
outfile = group + "-" + stringVersion + ".exe"
icon = "${projectDir}/src/main/resources/sassa/sassa.ico"
}
repositories {
mavenLocal()
maven {
url = uri('https://jitpack.io')
}
maven {
url = uri('https://repo.maven.apache.org/maven2')
}
}
task buildAll(type: GradleBuild) {
tasks = ['jar', 'createExe', 'assemble']
}
publishing {
publications {
maven(MavenPublication) {
from(components.java)
}
}
}
Caused by: groovy.lang.MissingPropertyException: Could not get unknown
property 'NEXUS_USERNAME' for object of type
org.gradle.api.publication.maven.internal.deployer.DefaultGroovyMavenDeployer.
I do not understand this problem. even though I know his mistake. but I still don't understand how to solve the problem.
this is my Gradle code
apply plugin: 'idea'
apply plugin: 'kotlin'
apply plugin: 'maven'
apply plugin: 'signing'
apply plugin: 'org.jetbrains.dokka'
buildscript {
ext.version_kotlin = '1.3.21'
ext.version_dokka = '0.9.17'
ext.version_java_util = '[2.0.1,2.1.0)'
ext.version_slf4j = '[1.7,1.8)'
ext.version_mockito = '[2.8,2.9)'
ext.version_logback = '[1.2,1.3)'
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$version_kotlin"
classpath "org.jetbrains.dokka:dokka-gradle-plugin:$version_dokka"
}
}
dokka {
outputFormat = 'html'
outputDirectory = "$projectDir/doc/javadoc"
}
version VERSION
group GROUP
repositories {
mavenCentral()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$version_kotlin"
api "com.github.michael-rapp:java-util:$version_java_util"
implementation "org.slf4j:slf4j-api:$version_slf4j"
testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$version_kotlin"
testImplementation "org.mockito:mockito-core:$version_mockito"
testImplementation "ch.qos.logback:logback-classic:$version_logback"
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from tasks.javadoc.destinationDir
}
task sourcesJar(type: Jar) {
from sourceSets.main.allSource
classifier = 'sources'
}
artifacts {
archives jar
archives javadocJar
archives sourcesJar
}
signing {
required { gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION
repository(url: RELEASE_REPOSITORY_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
snapshotRepository(url: SNAPSHOT_REPOSITORY_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
licenses {
license {
name POM_LICENCE_NAME
url POM_LICENCE_URL
distribution POM_LICENCE_DIST
}
}
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
in the section is red " MavenDeployment "
I take raw materials on GitHub. I want to use this application to be able to use APRIORI logic. if anyone can help please comment below. for more details, I also include the address where I downloaded it Link
The structure of multi project is
Root
+---ProjectA
+---ProjectB
+---ProjectC
+ ...
I want to publish a single consolidated jar file in
task allJar
build.gradle
buildscript {
repositories {
mavenLocal()
maven {
url "myurl"
credentials {
// Credentials needed to pull build dependencies from Nexus
username "$username"
password "$password"
}
}
}
}
apply plugin: "maven-publish"
apply plugin: "maven"
allprojects {
repositories {
mavenLocal()
maven {
credentials {
username "$username"
password "$password"
}
url "url"
}
group 'com.myproject'
version = '1.0.0-SNAPSHOT'
}
subprojects {
apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8
sourceSets.main.java.srcDir "src/main/java"
sourceSets.main.resources.srcDirs "src/main/resources"
sourceSets.test.java.srcDir "src/test/java"
sourceSets.test.resources.srcDirs "src/test/resources"
dependencies {
// string utils
compile "org.apache.commons:commons-lang3:3.4"
testCompile "junit:junit"
}
compileJava.dependsOn(processResources)
}
}
subprojects.each { subproject ->
evaluationDependsOn(subproject.path)
}
task allJar(type: Jar, dependsOn: subprojects.assemble) {
baseName = project.name
subprojects.each { subproject ->
from subproject.configurations.archives.artifacts.files.collect {
zipTree(it)
}
}
}
publishing {
publications {
mavenJava(MavenPublication) {
artifactId = project.name
from components.java
artifact allJar
println "Project Group: " + project.group + "\nProject Name: " + project.name + "\nProject Version: " + project.version
}
}
repositories {
maven {
credentials{
username NEXUS_USER
password NEXUS_PASS
}
url "myurl"
}
}
}
Problems
I am getting error during publish as
Invalid publication 'mavenJava': multiple artifacts with the identical extension and classifier ('jar', 'null
').
Adding a classifier :'all' in task allJar solves the issue but it creates 2 jars in root folder
build/libs/MyProject-1.0.0-SNAPSHOT.jar
build/libs/MyProject-1.0.0-SNAPSHOT-all.jar
When I try to publish artifacts to a personal artifactory repository,
when I look in the repository I notice that the pom that was published does not include the dependencies that the proeject has,
can you please explain what is wrong with my build?
buildscript {
repositories {
jcenter()
}
dependencies {
// Add this line
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.1"
}
}
// Apply the java plugin to add support for Java
apply plugin: 'java'
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
apply plugin: 'maven'
group 'CaptchaSolving'
version '1.0.0'
sourceCompatibility = 1.5
// In this section you declare where to find the dependencies of your project
repositories {
// Use 'jcenter' for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
maven {
url 'https://artifactory.lyoko.pw:443/libs-release-local'
credentials {
username = "${artifactory_username}"
password = "${artifactory_password}"
}
}
}
sourceSets {
main {
java {
srcDir 'src/'
}
}
}
// In this section you declare the dependencies for your production and test code
dependencies {
compile(group: 'com.pragone.custom', name: 'jpHash', version: '1.0.1')
}
task assembleRelease(type: Jar, dependsOn:classes) {
classifier = 'release'
manifest {
attributes 'Implementation-Title': project.group,
'Implementation-Version': version,
'Main-Class': ''
}
baseName = project.name
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
artifacts {
archives assembleRelease
}
def libraryGroupId = group
def libraryArtifactId = rootProject.name
def libraryVersion = version
publishing {
publications {
jar(MavenPublication) {
groupId libraryGroupId
version libraryVersion
artifactId libraryArtifactId
artifact("$buildDir/libs/${artifactId}-${libraryVersion}.jar")
}
}
}
artifactory {
contextUrl = 'https://artifactory.lyoko.pw'
publish {
repository {
repoKey = 'libs-release-local'
username = artifactory_username
password = artifactory_password
}
defaults {
publications('jar')
publishArtifacts = true
properties = ['qa.level': 'basic', 'dev.team': 'core']
publishPom = true
}
}
}
as you can see, there is only one dependency,
and the pom that gets published is:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>CaptchaSolving</groupId>
<artifactId>CaptchaSolving</artifactId>
<version>1.0.0</version>
</project>
(obtained from the view tab at artifactory)
as you can see
it has none of the repositories that I specified.
so I just want the resulting pom to include the repositories and the dependencies this project depends on.
I managed to solve the problem after seeing this post and trying a few things out.
It appears, the block:
publishing {
publications {
jar(MavenPublication) {
groupId libraryGroupId
version libraryVersion
artifactId libraryArtifactId
artifact("$buildDir/libs/${artifactId}-${libraryVersion}.jar")
}
}
}
was missing:
from components.java
so the final solution is:
publishing {
publications {
jar(MavenPublication) {
from components.java
groupId libraryGroupId
version libraryVersion
artifactId libraryArtifactId
artifact("$buildDir/libs/${artifactId}-${libraryVersion}.jar")
}
}
}