Yanıtlar:
Java kullandığınızı varsayarsak,
Dizininizde .properties
(en yaygın olarak) bir dosya oluşturun src/main/resources
(ancak 4. adımda başka bir yere bakmasını söyleyebilirsiniz).
.properties
Proje sürümü için standart Maven özelliğini kullanarak dosyanızdaki bazı özelliklerin değerini ayarlayın : foo.bar=${project.version}
Java kodunuzda, özellikler dosyasındaki değeri sınıfyolundan kaynak olarak yükleyin (bunun nasıl yapılacağına dair bol örnek için google, ancak işte yeni başlayanlar için bir örnek ).
Maven'de kaynak filtrelemeyi etkinleştirin - bu Maven'in o dosyayı çıktı sınıflarınıza kopyalamasına ve özelliği bu yorumlama sırasında kaynağı çevirmesine neden olur. Burada bazı bilgiler bulabilirsiniz, ancak çoğunlukla bunu pom'unuzda yaparsınız:
<İnşa> <Kaynakları> <Kaynak> <Dizin> src / main / resources </ dizin> <Filtreleme> true </ filtreleme> </ Kaynak> </ Kaynaklar> </ Yapı>
Ayrıca gibi diğer standart özellikler alabilirsiniz project.name
, project.description
, kendi pom koymak ve hatta keyfi özellikler <properties>
, Maven profillerle kombine vs. Kaynak filtreleme, size oluşturma zaman değişken yapı davranışını verebilir. Çalışma zamanında ile bir profil belirttiğinizde -PmyProfile
, daha sonra derlemenizde görünebilecek özellikleri etkinleştirebilirsiniz.
src/main/resources
İkili dosyalar da dahil olmak üzere bu dizinde bulunan tüm dosyaları işleyebileceğinden, doğrudan filtrelemeyi kullanmaya dikkat edin . Öngörülemeyen davranışlardan kaçınmak için src/main/resources-filtered
, burada önerildiği gibi bir dizine filtre uygulamak daha iyidir . Her neyse, bu güzel numara için teşekkürler!
Kabul edilen yanıt, bir sürüm numarasını statik olarak bir uygulamaya almak için en iyi ve en kararlı yol olabilir , ancak aslında asıl soruyu cevaplamaz: Artefaktın sürüm numarasını pom.xml'den nasıl alabilirim? Böylece, çalışma zamanı sırasında dinamik olarak nasıl yapılacağını gösteren bir alternatif sunmak istiyorum :
Maven'in kendisini kullanabilirsiniz. Daha kesin olmak gerekirse bir Maven kütüphanesi kullanabilirsiniz.
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
Ve sonra Java'da böyle bir şey yapın:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.FileReader;
import java.io.IOException;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model = reader.read(new FileReader("pom.xml"));
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
Konsol günlüğü aşağıdaki gibidir:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT
2017-10-31 Güncellemesi: Simon Sobisch'in takip sorusunu cevaplamak için örneği şu şekilde değiştirdim:
package de.scrum_master.app;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model;
if ((new File("pom.xml")).exists())
model = reader.read(new FileReader("pom.xml"));
else
model = reader.read(
new InputStreamReader(
Application.class.getResourceAsStream(
"/META-INF/maven/de.scrum-master.stackoverflow/aspectj-introduce-method/pom.xml"
)
)
);
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
package
maven-montaj-eklentisi ile paketlenmiş zaman d kavanoz (bağımlılık sınıfları entegre edilmemiş) ve çalışmıyor jar-with-dependencies
ben olsun a java.io.FileNotFoundException: pom.xml
(son kavanozda olduğu gibi META-INF/maven/my.package/myapp/pom.xml
) - bunun nasıl çözüleceğine dair ipuçları var mı?
Paketlenmiş eserler META-INF/maven/${groupId}/${artifactId}/pom.properties
içeriğe benzeyen bir dosya içerir :
#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang
Birçok uygulama bu dosyayı uygulama / jar sürümünü çalışma zamanında okumak için kullanır, sıfır kurulum gerekir.
Yukarıdaki yaklaşımla ilgili tek sorun, bu dosyanın (şu anda) package
faz sırasında üretilmesidir ve bu nedenle testler vb. Sırasında mevcut olmayacaktır (bunu değiştirmek için bir Jira sorunu vardır, bkz. MJAR-76 ). Bu sizin için bir sorunsa, Alex'in tarif ettiği yaklaşım gitmenin yoludur.
Maven kullanarak uygulama sürüm numaranızı görüntülemenin kolay yolunda açıklanan yöntem de vardır :
Bunu pom.xml'e ekle
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>test.App</mainClass>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Sonra şunu kullanın:
App.class.getPackage().getImplementationVersion()
Bu yöntemi daha basit buldum.
getImplementationVersion()
oldu null
. (maven sürüm 3.0.4)
.war
eserler, kullanmayı unutmayın maven-war-plugin
yerinemaven-jar-plugin
getImplementationVersion()
null döndürür).
Kavanoz veya savaş gibi mvn ambalaj kullanıyorsanız, şunları kullanın:
getClass().getPackage().getImplementationVersion()
Arşivde oluşturulan META-INF / MANIFEST.MF (pom.xml sürümüne ayarlanan) bir özelliği "Uygulama-Sürüm" okur.
@Kieste'nin yayınladığı şeyi tamamlamak için, Spring-boot kullanıyorsanız Maven'in kodunuzda bilgi oluşturmasının en iyi yolu olduğunu düşünüyorum: http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # production-ready-application-info çok faydalıdır.
Sadece etkinleştirmek eyleyicilere gerekir ve gereken özellikler eklemek sizin application.properties
veyaapplication.yml
Automatic property expansion using Maven
You can automatically expand info properties from the Maven project using resource filtering. If you use the spring-boot-starter-parent you can then refer to your Maven ‘project properties’ via @..@ placeholders, e.g.
project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
info.build.artifact=@project.artifactId@
info.build.name=@project.name@
info.build.description=@project.description@
info.build.version=@project.version@
Basit bir çözüm kolaylığı için bu Kütüphaneyi kullanın. Manifest'e ihtiyacınız olan her şeyi ekleyin ve ardından dizeye göre sorgulayın.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
Bazen Maven komut satırı, proje sürümüyle ilgili bir şey komut dosyası oluştururken, örneğin bir depodan URL yoluyla yapay nesne almak için yeterlidir:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
Kullanım örneği:
VERSION=$( mvn help:evaluate -Dexpression=project.version -q -DforceStdout )
ARTIFACT_ID=$( mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout )
GROUP_ID_URL=$( mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout | sed -e 's#\.#/#g' )
curl -f -S -O http://REPO-URL/mvn-repos/${GROUP_ID_URL}/${ARTIFACT_ID}/${VERSION}/${ARTIFACT_ID}-${VERSION}.jar
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
Sürüm Kullanarak Alın this.getClass().getPackage().getImplementationVersion()
PS Eklemeyi unutmayın:
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
Atıfla ketankk cevabı :
Ne yazık ki, bunu ekleyerek uygulamamın kaynaklarla nasıl başa çıktığını ekledi:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Ancak bunu maven-assemble-plugin'in <manifest> etiketi içinde kullanmak hile yaptı:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
Bu yüzden kullanarak sürüm elde edebildim
String version = getClass().getPackage().getImplementationVersion();