java - রানটাইম এ Maven আর্টিফ্যাক্ট সংস্করণ পান




maven-2 (5)

আমি লক্ষ্য করেছি যে একটি মেনন আর্টিফ্যাক্ট এর জার মধ্যে, project.version বৈশিষ্ট্য দুটি ফাইলগুলিতে অন্তর্ভুক্ত করা হয়েছে:

META-INF/maven/${groupId}/${artifactId}/pom.properties
META-INF/maven/${groupId}/${artifactId}/pom.xml

রানটাইম এ এই সংস্করণ পড়তে একটি সুপারিশ উপায় আছে?


Eclipse এ এটি চালানোর জন্য, যেমন একটি addDefaultImplementationEntries বিল্ড তৈরি করতে, আপনাকে addDefaultImplementationEntries এবং addDefaultSpecificationEntries পোম এন্ট্রিগুলিকে অন্য জবাবগুলিতে বর্ণিত হিসাবে যোগ করা উচিত, তারপরে নিম্নলিখিত কোডটি ব্যবহার করুন:

public synchronized static final String getVersion() {
    // Try to get version number from pom.xml (available in Eclipse)
    try {
        String className = getClass().getName();
        String classfileName = "/" + className.replace('.', '/') + ".class";
        URL classfileResource = getClass().getResource(classfileName);
        if (classfileResource != null) {
            Path absolutePackagePath = Paths.get(classfileResource.toURI())
                    .getParent();
            int packagePathSegments = className.length()
                    - className.replace(".", "").length();
            // Remove package segments from path, plus two more levels
            // for "target/classes", which is the standard location for
            // classes in Eclipse.
            Path path = absolutePackagePath;
            for (int i = 0, segmentsToRemove = packagePathSegments + 2;
                    i < segmentsToRemove; i++) {
                path = path.getParent();
            }
            Path pom = path.resolve("pom.xml");
            try (InputStream is = Files.newInputStream(pom)) {
                Document doc = DocumentBuilderFactory.newInstance()
                        .newDocumentBuilder().parse(is);
                doc.getDocumentElement().normalize();
                String version = (String) XPathFactory.newInstance()
                        .newXPath().compile("/project/version")
                        .evaluate(doc, XPathConstants.STRING);
                if (version != null) {
                    version = version.trim();
                    if (!version.isEmpty()) {
                        return version;
                    }
                }
            }
        }
    } catch (Exception e) {
        // Ignore
    }

    // Try to get version number from maven properties in jar's META-INF
    try (InputStream is = getClass()
        .getResourceAsStream("/META-INF/maven/" + MAVEN_PACKAGE + "/"
                + MAVEN_ARTIFACT + "/pom.properties")) {
        if (is != null) {
            Properties p = new Properties();
            p.load(is);
            String version = p.getProperty("version", "").trim();
            if (!version.isEmpty()) {
                return version;
            }
        }
    } catch (Exception e) {
        // Ignore
    }

    // Fallback to using Java API to get version from MANIFEST.MF
    String version = null;
    Package pkg = getClass().getPackage();
    if (pkg != null) {
        version = pkg.getImplementationVersion();
        if (version == null) {
            version = pkg.getSpecificationVersion();
        }
    }
    version = version == null ? "" : version.trim();
    return version.isEmpty() ? "unknown" : version;
}

যদি আপনার জাভা বিল্ড "লক্ষ্য / ক্লাস" ছাড়া অন্য কোথাও লক্ষ্য শ্রেণীগুলিকে রাখে, তবে আপনাকে সেগমেন্টসওরোমভভের মান সামঞ্জস্য করতে হতে পারে।


আপনাকে প্রদত্ত লাইব্রেরি / বর্গের সংস্করণ তথ্য পেতে Maven- নির্দিষ্ট ফাইল অ্যাক্সেস করতে হবে না।

আপনি কেবল getClass().getPackage().getImplementationVersion() ব্যবহার করতে পারেন getClass().getPackage().getImplementationVersion() একটি .jar-files MANIFEST.MF সংরক্ষিত সংস্করণ তথ্য পেতে। সৌভাগ্যক্রমে মেনন যথেষ্ট স্মার্ট, দূর্ভাগ্যবশত মেনন ম্যানিফেস্টে সঠিক তথ্যও ডিফল্ট ভাবে লিখেন না!

পরিবর্তে addDefaultImplementationEntries এবং addDefaultSpecificationEntries সেট করার জন্য addDefaultImplementationEntries maven-jar-plugin <archive> কনফিগারেশন উপাদানটি সংশোধন করতে হবে:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>                   
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
        </archive>
    </configuration>
</plugin>

আদর্শভাবে এই কনফিগারেশন কোম্পানী pom বা অন্য বেস-পোম মধ্যে করা উচিত।

<archive> Archive <archive> উপাদানটির বিস্তারিত ডকুমেন্টেশন মেনন আর্কাইভ ডকুমেন্টেশনে পাওয়া যেতে পারে।


আমি এখানে দুটি প্রধান পদ্ধতিতে কিছু সময় ব্যয় করেছি এবং তারা আমার জন্য কাজ করে নি। আমি builds জন্য Netbeans ব্যবহার করছি, সেখানে আরো যাচ্ছে হতে পারে। আমি কিছু গঠন সঙ্গে Maven 3 থেকে কিছু ত্রুটি এবং সতর্কতা ছিল, কিন্তু আমি মনে করি যারা সঠিক ছিল। কোন বড়ি।

আমি একটি উত্তর খুঁজে পেয়েছি যা DZone এ এই নিবন্ধটি কার্যকর করার জন্য রক্ষণযোগ্য এবং সহজ দেখায়:

আমি ইতিমধ্যে একটি সংস্থান / কনফিগারেশন সাব-ফোল্ডার আছে, এবং আমি আমার ফাইলটি নাম্বার দিয়েছিলাম: app.properties, আমরা যে ধরনের উপাদান রাখতে পারি সেটি আরও ভালোভাবে প্রতিফলিত করতে (একটি সমর্থন URL, ইত্যাদি)।

একমাত্র সতর্কতা হল নেটবিসেস একটি সতর্কতা দেয় যে আইডিই ফিল্টারিং বন্ধ করে দেয়। নিশ্চিত না যেখানে / কিভাবে। এটা এই সময়ে কোন প্রভাব আছে। সম্ভবত সেটি যদি সে সেতুটি অতিক্রম করতে হয় তবে তার জন্য একটি কাজ আছে। ভাগ্য সুপ্রসন্ন হোক.


একটি .war আর্টিফ্যাক্টের উপরে উত্তরটি অনুসরণ করার জন্য, আমি খুঁজে পেয়েছি যে .war maven-jar-plugin পরিবর্তে maven-war-plugin এ সমান কনফিগারেশন প্রয়োগ করতে হয়েছে:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1</version>
    <configuration>
        <archive>                   
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
        </archive>
    </configuration>
</plugin>

এটি প্রকল্পটির .jar MANIFEST.MF তে সংস্করণ তথ্য যুক্ত করেছে ( WEB-INF/lib .war )


জাভা 8 বৈচিত্র্য EJB জন্য মেইন প্রকল্প সঙ্গে যুদ্ধ ফাইল। ইএপি 7.0 পরীক্ষিত।

@Log4j // lombok annotation
@Startup
@Singleton
public class ApplicationLogic {

    public static final String DEVELOPMENT_APPLICATION_NAME = "application";

    public static final String DEVELOPMENT_GROUP_NAME = "com.group";

    private static final String POM_PROPERTIES_LOCATION = "/META-INF/maven/" + DEVELOPMENT_GROUP_NAME + "/" + DEVELOPMENT_APPLICATION_NAME + "/pom.properties";

    // In case no pom.properties file was generated or wrong location is configured, no pom.properties loading is done; otherwise VERSION will be assigned later
    public static String VERSION = "No pom.properties file present in folder " + POM_PROPERTIES_LOCATION;

    private static final String VERSION_ERROR = "Version could not be determinated";

    {    
        Optional.ofNullable(getClass().getResourceAsStream(POM_PROPERTIES_LOCATION)).ifPresent(p -> {

            Properties properties = new Properties();

            try {

                properties.load(p);

                VERSION = properties.getProperty("version", VERSION_ERROR);

            } catch (Exception e) {

                VERSION = VERSION_ERROR;

                log.fatal("Unexpected error occured during loading process of pom.properties file in META-INF folder!");
            }
        });
    }
}




maven-2