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-filekomut 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-filekomut 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-fileYerel 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!
artifactIdve groupIdetrafı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.xmldosya 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-repoMaven 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-repokaynak klasörünüzde
Böyle bir çözüm istiyorum - maven-install-pluginpom 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 initializeyerel 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ı initializeadı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 packageJAR'ı 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, pluginsderleme 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 installveya mvn testyerel 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-pluginhedefi install-filede 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>
fileYolu 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 libve libprojeye ö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-pluginyukarıda gösterildiği gibi yapılandırdıktan sonra pom.xml, bu kavanozları pom.xmlher zamanki gibi kullanmanız gerekir :
<dependency>
<groupId>com.amazonservices.mws</groupId>
<artifactId>mws-client</artifactId>
<version>1.0</version>
</dependency>
Not o maven-install-pluginyerel 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