Указать maven папку с библиотеками
У меня есть проект maven, в котором я подключаю нужные мне библиотеки. У меня есть директория, в которой лежит мой скомпилированный jar файл и директория с библиотеками (libs). Задача заключается в том, чтобы этот jar файл брал библиотеки из этой папки (с подключением библиотек в самом проекте все в порядке). С maven начал работать только недавно, нужной информации в гугле не нашел.
IDE - Intellij IDEA Ultimate 2020.2
Ответы (2 шт):
Не совсем по теме вопроса. Метод для сборки war файла - веб приложения, разделенного на библиотеки.
Можно собрать и установить один проект в локальный репозиторий maven (по умолчанию в папку .m2) в виде библиотеки jar. У вас может быть несколько таких библиотек. Потом в другом проекте можно будет использовать эти библиотеки как зависимости. Например:
Первый проект: библиотека
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<url>https://example.com/module1</url>
<groupId>com.example</groupId>
<artifactId>module1</artifactId>
<name>module1</name>
<version>1.0.1</version>
<packaging>jar</packaging>
<properties>
<java.version>12</java.version>
</properties>
<build>
<finalName>module1</finalName>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<inherited>true</inherited>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Второй проект: приложение
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<url>https://example.com/module2</url>
<groupId>com.example</groupId>
<artifactId>module2</artifactId>
<name>module2</name>
<version>1.0.2</version>
<packaging>war</packaging>
<properties>
<java.version>12</java.version>
</properties>
<build>
<finalName>module2</finalName>
<defaultGoal>package</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- com.example -->
<dependency>
<groupId>com.example</groupId>
<artifactId>module1</artifactId>
<version>1.0.1</version>
</dependency>
</dependencies>
</project>
Лучше наверное будет привести пример. В данном проекте прописано, что при сборке все зависимости будут копировать в директорию libs.
Файл pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.somepackage</groupId>
<artifactId>some-project</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Main класс:
package com.somepackage;
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
public class Main {
public static void main(String[] args) {
double[] values = new double[]{1, 10, 100, 1000, 10000, 100000};
DescriptiveStatistics descriptiveStatistics =
new DescriptiveStatistics();
for (double v : values) {
descriptiveStatistics.addValue(v);
}
double median = descriptiveStatistics.getPercentile(50);
System.out.println("Median: " + median);
}
}
Соответственно после сборки проекта мы получим директорию libs, в которой будут содержаться все зависимости (commons-math3-3.6.1.jar) и файл some-project-1.0.jar. Для запуска программы нужно будет выполнить одну из следующих команд.
Windows:
java -cp "some-project-1.0.jar;libs/*" com.somepackage.Main
Linux:
java -cp "some-project-1.0.jar:libs/*" com.somepackage.Main
Также можно рассмотреть вариант записи Main класса и зависимостей в MANIFEST.MF. Для этого необходимо добавить в pom.xml следующий фрагмент:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>libs/</classpathPrefix>
<mainClass>com.somepackage.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
В результате получим следующий MANIFEST.MF:
Manifest-Version: 1.0
Created-By: Maven Archiver 3.4.0
Build-Jdk-Spec: 11
Class-Path: libs/commons-math3-3.6.1.jar
Main-Class: com.somepackage.Main
Соответственно запуск можно будет производить следующим образом:
java -jar some-project-1.0.jar