Yerel jar dosyalarını (henüz Maven deposunun bir parçası değil) doğrudan projemin kütüphane kaynaklarına nasıl ekleyebilirim?
install-file
komut dosyaları.
Yerel jar dosyalarını (henüz Maven deposunun bir parçası değil) doğrudan projemin kütüphane kaynaklarına nasıl ekleyebilirim?
install-file
komut dosyaları.
Yanıtlar:
JAR'ı aşağıdaki gibi yerel Maven veri havuzunuza kurun:
mvn install:install-file \
-Dfile=<path-to-file> \
-DgroupId=<group-id> \
-DartifactId=<artifact-id> \
-Dversion=<version> \
-Dpackaging=<packaging> \
-DgeneratePom=true
Her biri aşağıdakileri ifade eder:
<path-to-file>
: yüklenecek dosyanın yolu örn. → c:\kaptcha-2.3.jar
<group-id>
: Dosyanın kaydedilmesi gereken grup örn. → com.google.code
<artifact-id>
: dosya için artefakt adı örn. → kaptcha
<version>
: dosyanın sürümü örn. → 2.3
<packaging>
: dosyanın paketlenmesi örn. → jar
Referans
install:install-file
Yerel bağımlılıkları doğrudan ekleyebilirsiniz ( mülk kütüphaneleri dahil olan derleme projesinde belirtildiği gibi) şöyle:
<dependency>
<groupId>com.sample</groupId>
<artifactId>sample</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/Name_Your_JAR.jar</systemPath>
</dependency>
Güncelleme
Yeni sürümlerde bu özellik kullanımdan kaldırılmış olarak işaretleniyor, ancak hala çalışıyor ve henüz kaldırılmamış (Sadece başlatma sırasında günlükte uyarı görüyorsunuz). Maaven grubunda bu https://issues.apache.org/jira/browse/MNG-6523 ile ilgili bir sorun ortaya çıkıyor (Bu özelliğin bazı durumlarda neden yararlı olduğunu açıklayabilir ve açıklayabilirsiniz). Umarım bu özellik orada kalır!
Bana soruyorsanız, özellik kaldırılmadığı sürece bunu, projemde depoya sığmayan yalnızca bir yaramaz kavanoz dosyasına bağımlılık yapmak için kullanıyorum . Bu özellik kaldırılırsa, burada daha sonra seçebileceğim birçok iyi cevap var!
artifactId
ve groupId
etrafında yanlış şekilde?
Öncelikle, bu cevap için anonim bir Stack Overflow kullanıcısına kredi vermek istiyorum - Daha önce burada benzer bir cevap gördüğümden eminim - ama şimdi bulamıyorum.
Bağımlılık olarak yerel JAR dosyalarına sahip olmanın en iyi seçeneği, yerel bir Maven deposu oluşturmaktır. Böyle bir havuz, içinde pom dosyaları bulunan uygun bir dizin yapısından başka bir şey değildir.
Örneğim için: Ana projem ${master_project}
yerinde var ve alt proje1 açık ${master_project}/${subproject1}
.
Sonra bir Maven deposu oluşturuyorum:
${master_project}/local-maven-repo
.
Adresindeki subproject1'deki pom dosyasında, ${master_project}/${subproject1}/pom.xml
dosya yolunu URL parametresi olarak alacak deponun belirtilmesi gerekir:
<repositories>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.parent.basedir}/local-maven-repo</url>
</repository>
</repositories>
Bağımlılık, diğer havuzlarda olduğu gibi belirtilebilir. Bu pom havuzunuzu bağımsız hale getirir. Örneğin, istenen JAR Maven merkezinde kullanılabilir olduğunda, yerel repodan silmeniz yeterlidir ve varsayılan repodan çekilir.
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.servicebinder</artifactId>
<version>0.9.0-SNAPSHOT</version>
</dependency>
Yapılacak son fakat en az olmayan şey, -DlocalRepositoryPath anahtarını kullanarak JAR dosyasını yerel depoya eklemektir:
mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file \
-Dfile=/some/path/on/my/local/filesystem/felix/servicebinder/target/org.apache.felix.servicebinder-0.9.0-SNAPSHOT.jar \
-DgroupId=org.apache.felix -DartifactId=org.apache.felix.servicebinder \
-Dversion=0.9.0-SNAPSHOT -Dpackaging=jar \
-DlocalRepositoryPath=${master_project}/local-maven-repo
JAR dosyası kurulduktan sonra Maven deponuz bir kod havuzuna bağlanabilir ve tüm kurulum sistemden bağımsızdır. ( GitHub'da çalışma örneği ).
JAR'ların kaynak kodu repo'suna bağlı kalmasının iyi bir uygulama olmadığını, ancak gerçek hayatta, hızlı ve kirli çözümlerin bazen yayınlayamadığınız bir JAR'ı barındırmak için tam bir Nexus repo'dan daha iyi olduğunu kabul ediyorum.
${project.parent.basedir}
bugünlerde hiçbir şeye çözüm bulamadım ${project.basedir}/..
ve mükemmel çalıştım.
<mirrorOf>*</mirrorOf>
.
Yeni bir klasör oluşturun, diyelim local-maven-repo
Maven projenizin kökünde.
Sadece yerel bir repo <project>
ekleyin pom.xml
:
<repositories>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.basedir}/local-maven-repo</url>
</repository>
</repositories>
Ardından, yüklemek istediğiniz her harici kavanoz için projenizin köküne gidin ve yürütün:
mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]
local-maven-repo
kaynak klasörünüzde
Böyle bir çözüm istiyorum - maven-install-plugin
pom dosyasında kullanın :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>lib/yourJar.jar</file>
<groupId>com.somegroup.id</groupId>
<artifactId>artefact-id</artifactId>
<version>x.y.z</version>
<packaging>jar</packaging>
</configuration>
</execution>
</executions>
</plugin>
Bu durumda mvn initialize
yerel maven deposuna gerçekleştirebilirsiniz ve kavanoz kurulacaktır. Şimdi bu kavanoz bu makinedeki herhangi bir maven adımı sırasında kullanılabilir (bu bağımlılığı <dependency></dependency>
etiketli pom'daki diğer herhangi bir maven bağımlılığı olarak eklemeyi unutmayın ). Kavanoz montajını initialize
adım adım değil , istediğiniz diğer adımlara bağlamak da mümkündür .
mvn initialize
önce çalıştırırsam mvn package
: mvn initialize package
JAR'ı merkezi repodan indirmeye çalışamam veya başka bir şey denemem. Bu neden? Bu hedefleri / aşamaları sırayla yürüteceğini düşündüm.
compile
) Yapı başarısız olur.
<dependency>
<groupId>group id name</groupId>
<artifactId>artifact name</artifactId>
<version>version number</version>
<scope>system</scope>
<systemPath>jar location</systemPath>
</dependency>
<scope>system
şu anda kullanımdan kaldırıldı.
install:install-file
, yerel repoya yönelik artefakt ve bunu "normal" bir bağımlılık (varsayılan kapsamla compile
) olarak kullanın veya bir proje içi depo çözümü kullanın .
Evet, sahip olabilirsin ama iyi bir fikir değil.
Bunun yerine depoları silmek için tüm bu kavanozları takın
Ayrıca Bkz.
Gerçekten hızlı ve kirli bir yol yerel bir dosyayı işaret etmektir:
<dependency>
<groupId>sample</groupId>
<artifactId>com.sample</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath>
</dependency>
Ancak bu yalnızca makinenizde (açıkça) yaşayacaktır, paylaşmak için genellikle uygun bir m2 arşivi (nexus / yapay) kullanmak veya bunlardan herhangi birine sahip değilseniz veya yerel bir maven kurmak istemiyorsanız mantıklıdır. yapılandırılmış arşiv ve pom: local:
<repositories>
<repository>
<id>my-local-repo</id>
<url>file://C:/DEV//mymvnrepo</url>
</repository>
</repositories>
uzaktan:
<repositories>
<repository>
<id>my-remote-repo</id>
<url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
</repository>
</repositories>
bunun için basedir değişkeni kullanılarak göreceli bir yol da mümkündür:
<url>file:${basedir}</url>
<url>file:${basedir}</url>
bunun yerine temel URL kullanmanız gerekiyor .
POM dosyasına kendi yerel JAR'ınızı ekleyin ve bunu maven derlemesinde kullanın.
mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar
Örneğin:
mvn install:install-file -Dfile=path-to-jar -DgroupId=com.decompiler -DartifactId=jd-core-java -Dversion=1.2 -Dpackaging=jar
Sonra POM'a şöyle ekleyin:
Bunun bir yolu, kendi Maven veri havuzu yöneticinize (Nexus gibi) yüklemektir. Zaten kendi havuz yöneticisine sahip olmak iyi bir uygulamadır.
Son zamanlarda gördüğüm bir başka güzel yol da Maven Kurulum Eklentisini derleme yaşam döngünüze dahil etmektir: Dosyaları yerel depoya kurmayı POM'da bildirirsiniz. Biraz ama küçük bir ek yük ve manuel bir adım söz konusu değil.
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
Tabii ki bu klasöre kavanoz ekleyebilirsiniz. Ama belki de elde etmek istediğiniz şey bu değildir ...
Derleme için bu kavanozlara ihtiyacınız varsa, şu ilgili soruyu kontrol edin: Maav 2 2 sınıf sınıfına yüklemeden kavanoz ekleyebilir miyim?
Ayrıca, herhangi biri önermeden önce, sistem kapsamını KULLANMAYIN.
Bir başka ilginç durum, projenizde özel maven kavanozlarına sahip olmak istediğinizde. Geçişli bağımlılıkları çözme konusunda Maven'in yeteneklerini korumak isteyebilirsiniz. Çözüm oldukça kolaydır.
Pom.xml dosyanıza aşağıdaki satırları ekleyin
<properties><local.repository.folder>${pom.basedir}/libs/</local.repository.folder>
</properties>
<repositories>
<repository>
<id>local-maven-repository</id>
<url>file://${local.repository.folder}</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
.M2 / repository klasörünü açın ve içe aktarmak istediğiniz projenin dizin yapısını libs klasörüne kopyalayın.
Örneğin, bağımlılığı içe aktarmak istediğinizi varsayalım
<dependency>
<groupId>com.mycompany.myproject</groupId>
<artifactId>myproject</artifactId>
<version>1.2.3</version>
</dependency>
Sadece .m2 / repository adresine gidin ve aşağıdaki klasörü göreceksiniz
com / firmam / myproject / 1.2.3
Libs klasörünüzdeki her şeyi kopyalayın (yine, .m2 / repository altındaki klasörler dahil ) ve işiniz bitti.
Bu sorun için daha iyi bir çözüm maven-install-plugin kullanmak olduğunu düşünüyorum , dosyaları yükleme zamanında otomatik olarak yüklemek için kullanmaktır. Projem için böyle ayarladım.
İlk olarak, yolu (yerel .jar dosyalarını depoladığınız yer) özellik olarak ekleyin.
<properties>
<local.sdk>/path/to/jar</local.sdk>
</properties>
Ardından, plugins
derleme sırasında kavanozları yüklemek için bir eklenti ekleyin.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>1</id>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<file>${local.sdk}/lib/impl/appengine-api.jar</file>
</configuration>
</execution>
<execution>
<id>appengine-api-stubs</id>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api-stubs</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<file>${local.sdk}/lib/impl/appengine-api-stubs.jar</file>
</configuration>
</execution>
</executions>
</plugin>
Son olarak, bağımlılıklarda, kavanozları ekleyebilirsiniz
<dependency>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api-stubs</artifactId>
<version>1.0</version>
<scope>test</scope>
</dependency>
Projenizi bu şekilde ayarladığınızda, proje başka bir bilgisayara götürseniz bile derlemeye devam edecektir (özellik tarafından belirtilen yoldaki tüm jar dosyalarına sahip olduğu göz önüne alındığında) local.sdk
).
İçin groupId
olmadığından emin olmak için benzersiz bir ad kullanın.
Artık siz mvn install
veya mvn test
yerel kavanozlar otomatik olarak eklenecektir.
Kavanozlarla dolu bir klasör yükleyebileceğiniz bir kodu paylaşmak istiyorum. Bir sağlayıcının genel bir deposu yoksa ve manuel olarak çok sayıda kitaplık eklemeniz gerektiğinde yararlıdır. Bellek yetersiz hataları olabilir çünkü doğrudan maven için çağrı yerine bir .bat inşa etmeye karar verdim. Windows ortamı için hazırlanmıştır, ancak linux işletim sistemine uyarlamak kolaydır:
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
public class CreateMavenRepoApp {
private static final String OCB_PLUGIN_FOLDER = "C://your_folder_with_jars";
public static void main(String[] args) throws IOException {
File directory = new File();
//get all the files from a directory
PrintWriter writer = new PrintWriter("update_repo_maven.bat", "UTF-8");
writer.println("rem "+ new Date());
File[] fList = directory.listFiles();
for (File file : fList){
if (file.isFile()){
String absolutePath = file.getAbsolutePath() ;
Manifest m = new JarFile(absolutePath).getManifest();
Attributes attributes = m.getMainAttributes();
String symbolicName = attributes.getValue("Bundle-SymbolicName");
if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject")) {
String[] parts =symbolicName.split("\\.");
String artifactId = parts[parts.length-1];
String groupId = symbolicName.substring(0,symbolicName.length()-artifactId.length()-1);
String version = attributes.getValue("Bundle-Version");
String mavenLine= "call mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -Dfile="+ absolutePath+" -DgroupId="+ groupId+" -DartifactId="+ artifactId+" -Dversion="+ version+" -Dpackaging=jar ";
writer.println(mavenLine);
}
}
}
writer.close();
}
}
Bu main'i herhangi bir IDE'den çalıştırdıktan sonra update_repo_maven.bat dosyasını çalıştırın.
String symbolicName = attributes.getValue("Bundle-SymbolicName"); if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject"))
yalnızca özel kavanozların destekleneceğini gösteriyor. İhtiyacımız olan bu değil: bunun yerine bir grup üçüncü parti kavanoz. Herhangi bir kavanozu bu şekilde nasıl kuracağınız konusunda önerileriniz var mı?
Bu, yeni sürümler için kısa bir sözdizimidir:
mvn install:install-file -Dfile=<path-to-file>
JAR, en yaygın durum olan Apache Maven tarafından inşa edildiğinde çalışır. Ardından, META-INF dizininin alt klasöründe, varsayılan olarak okunacak bir pom.xml içerecektir.
Kaynak: http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
Ayrıca ...
<scope>compile</scope>
Maven Bağımlılıkları . Bu varsayılan ama bazı durumlarda açıkça bu kapsamı Maven yerel depoda yerel kütüphaneleri bulmak için ayar buldum.
Nedense, web uygulamasında ne Alireza Fattahi'nin çözümüne ne de JJ Roman'ın çözümüne bakım veriyorum düzgün çalışmıyor. Her iki durumda da, derleme tamamlanır (kavanozu görür), ancak ambalaj kavanozu savaşın içine dahil edemez.
Çalışmasını sağlamanın tek yolu kavanozu /src/main/webapp/WEB-INF/lib/
giyip Fattahis ya da Roman'ın çözümü ile birleştirmektir.
Yerel bir repo kullanmanın mutlaka iyi bir fikir OLMADIĞINI unutmayın. Bu proje başkalarıyla paylaşılıyorsa, o zaman herkes işe yaramadığında sorunlar ve soruları olacaktır ve kavanoz kaynak kontrol sisteminizde bile mevcut olmayacaktır!
Paylaşılan repo en iyi cevap olsa da, bunu bir nedenden dolayı yapamazsanız, kavanozu gömmek yerel bir repodan daha iyidir. Yalnızca yerel repo içerikleri, özellikle zaman içinde birçok soruna neden olabilir.
Yerel deponuza, komutları vererek kavanozunuzu kurabilirsiniz
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
Aynı şeyi mkyoung'un web sitesinden yapmak için bu yararlı bağlantıyı takip edin . Ayrıca maven kılavuzunu da kontrol edebilirsiniz.
Üçüncü taraf kavanozunu kurmak için lütfen aşağıdaki gibi komutu arayın
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
- mvn yüklemek
Komut satırına aşağıdaki kodu yazabilir veya eclipse yerleşik maven kullanıyorsanız projeye sağ tıklayın -> Farklı Çalıştır -> yapılandırmaları çalıştır ... -> sol panelde Maven Build'a sağ tıklayın -> yeni yapılandırma -> Hedefler ve temel dizindeki kod: $ {project_loc: NameOfYourProject} -> Çalıştır
mvn install:install-file
-Dfile=<path-to-file>
-DgroupId=<group-id>
-DartifactId=<artifact-id>
-Dversion=<version>
-Dpackaging=<packaging>
-DgeneratePom=true
Her biri aşağıdakileri ifade eder:
<dosya yolu>: yüklenecek dosya yolu örn. -> c: \ kaptcha-2.3.jar
<grup kimliği>: Dosyanın örneğin - - com.google.code altında kaydedilmesi gereken grup
<artifact-id>: dosya için artefakt adı örn. -> kaptcha
<sürüm>: dosyanın sürümü ör. -> 2.3
<ambalaj>: dosyanın ambalajı örneğin -> kavanoz
2. yükledikten sonra, sadece pom.xml'de kavanoz ilan eder.
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
</dependency>
1. Adım: Yapılandırma maven-install-plugin
hedefi install-file
de seninpom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-external-non-maven-jar-MWS-Client-into-local-maven-repo</id>
<phase>clean</phase>
<configuration>
<repositoryLayout>default</repositoryLayout>
<groupId>com.amazonservices.mws</groupId>
<artifactId>mws-client</artifactId>
<version>1.0</version>
<file>${project.basedir}/lib/MWSClientJavaRuntime-1.0.jar</file>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
file
Yolu gerçek dosya yolunuza göre düzenlediğinizden emin olun (önerilen bu harici maven olmayan kavanozları bir klasörün içine yerleştirmek, diyelim lib
ve lib
projeye özgü göreceli yol kullanmak ve sistem eklemekten kaçınmak için bu klasörü projenizin içine yerleştirmek mutlak mutlak yol.
Birden fazla harici kavanozunuz varsa <execution>
, aynı kavanozdaki diğer kavanozlar için tekrarlayın maven-install-plugin
.
2. Adım: Dosyanızda maven-install-plugin
yukarıda gösterildiği gibi yapılandırdıktan sonra pom.xml
, bu kavanozları pom.xml
her zamanki gibi kullanmanız gerekir :
<dependency>
<groupId>com.amazonservices.mws</groupId>
<artifactId>mws-client</artifactId>
<version>1.0</version>
</dependency>
Not o maven-install-plugin
yerel yalnızca kopyalar dış kavanoz.m2
maven depo. Bu kadar. Bu kavanozları projenize maven bağımlılıkları olarak otomatik olarak dahil etmez.
Bu küçük bir nokta, ama bazen kaçırmak kolaydır.
Benim pom.xml bağımlılıkları bir dizi için aynı hatayı vardı pomsxml bağımlılıkları sürümleri belirtilmedi ve üst depoda bahsedildi çıkıyor. Nedense sürüm detayları bu repo ile senkronize değildi. Bu yüzden manuel olarak etiketini kullanarak sürümleri girdi ve bir cazibe gibi çalıştı. Üst öğedeki sürümleri aramak ve burada belirtmek için biraz zaman gerekiyordu. Ancak bu sadece artefakt hatasını gösteren kavanozlar için yapılabilir ve işe yarar. Umarım bu birine yardımcı olur.
Apache Maven 3.5.4'te çift tırnak eklemek zorunda kaldım. Çift tırnak olmadan benim için işe yaramadı.
örnek: mvn install: install-file "-Dfile = jar dosyasının konumu" "-DgroupId = grup kimliği" "-DartifactId = yapı kimliği" "-Dversion = sürüm" "-Dpackaging = paket türü"
yourproject
+- pom.xml
+- src
yourproject
+- pom.xml
+- src
+- repo
mvn deploy:deploy-file -Durl=file:///pathtoyour/repo -Dfile=your.jar -DgroupId=your.group.id -DartifactId=yourid -Dpackaging=jar -Dversion=1.0
mvn install:install-file -Dfile=/path-to-your-jar-1.0.jar -DpomFile=/path-to-your-pom-1.0.pom
<repositories>
<!--other repositories if any-->
<repository>
<id>project.local</id>
<name>project</name>
<url>file:${project.basedir}/repo</url>
</repository>
</repositories>
<dependency>
<groupId>com.groupid</groupId>
<artifactId>myid</artifactId>
<version>1.0</version>
</dependency>
BU CEVAP SADECE ECLIPSE KULLANICILARI İÇİNDİR:
Eclipse kullanıyorsanız, kavanozu lib / dizinine yerleştirin, kavanoz adına sağ tıklayın ve "yol oluşturmak için ekle" ye tıklayın. Eclipse "referans verilen kütüphaneler" yaratacak ve kavanozu sizin için yerleştirecek
Kavanozun programdaki ithalatını hemen benim için çözdü
.classpath
, ancak maven inşamvn package
maven bunun bir tanımı olmadığı için bu bağımlılığı kullanmaya başladıktan sonra broket olacaktır ve sadece içinde olmalıdırpom.xml