كيفية مشاركة خصائص مشتركة بين عدة مخضرم المشاريع ؟

StackOverflow https://stackoverflow.com/questions/1231561

سؤال

لدي العديد من المشاريع التي بناها مخضرم و أريد أن أشارك بعض خصائص مشتركة بينها - الربيع إصدار mysql إصدار برنامج التشغيل ، svn قاعدة url ، الخ.- حتى أستطيع تحديثها مرة واحدة و سوف ينعكس ذلك على جميع المشاريع.

فكرت في وجود واحد سوبر بوم مع جميع خصائص ، ولكن إذا قمت بتغيير واحد من المشكلة لا تحتاج إلى أي زيادة نسخته (و تحديث جميع تطلع اللاعبون النجوم ترث منه) أو حذفه من جميع المطورين الآلات التي لا تريد أن تفعل.

يمكن تحديد هذه المعايير خارجيا إلى بوم?أنا لا تزال تريد أن يكون الموقع الخارجي التعريف في الأصل بوم.

هل كانت مفيدة؟

المحلول

نلاحظ أن الفكرة الأصلية لدي هنا هو شيء أنا به, ولكن أن كنت قد وجدت فكرة أفضل بكثير مما كنت أيضا المدرجة أدناه.أردت أن أبقي كل الأفكار هنا للتأكد من اكتمالها في حالة أحدث فكرة لا لا العمل.


أعتقد يمكنك حل هذه المشكلة باستخدام الوالد بوم ، ولكن يجب أن يكون لديك مستودع مخضرم و CI بناء أداة.

لدي العديد من المشاريع التي ترث جميع خصائص قاعدة من أحد الوالدين بوم.ونحن استخدام جافا 1.5 ، حتى أن بناء العقار الإعداد هناك.كل شيء هو UTF-8.جميع التقارير التي كنت ترغب في تشغيل ، سونار الإعداد ، إلخ ، هو داخل الوالدين بوم.

على افتراض المشروع الخاص بك هو في التحكم في الإصدار وكنت قد حصلت على CI أداة عند تسجيل الوصول ، CI أداة يمكن بناء بوم المشروع و نشر اللقطة مخضرم اتفاقيات إعادة الشراء.إذا المشاريع الخاصة بك تشير إلى لقطة نسخة من الأصل بوم, أنها سوف تحقق من مستودع إلى التحقق من أن لديهم أحدث إصدار...لم يتمكنوا من تحميل أحدث إصدار.حتى إذا قمت بتحديث الوالدين, جميع مشاريع أخرى سيتم تحديث.

خدعة ، أعتقد هو الإفراج مع لقطة.أنا أقول النشرات الخاصة بك سوف تأتي كثير من الأحيان أقل بكثير من التغييرات.حتى تتمكن من تنفيذ إطلاق الخاص بك بوم ، ثم تحديث تطلع اللاعبون النجوم التي ترث منها والتحقق منها في التحكم في الإصدار.اسمحوا المشروعات الإنمائية يعرفون أنهم بحاجة إلى تحديث والذهاب من هناك.

هل يمكن أن مجرد الزناد يبني هناك إجبار جديدة تطلع اللاعبون النجوم في مستودع ومن ثم يكون كل من المشروعات الإنمائية التقاط التغييرات التلقائى عند بناء.


لقد أزلت أحدث/الإفراج عن الكلمات الرئيسية الفكرة لأنها لا تعمل على الوالدين تطلع اللاعبون النجوم.أنها تعمل فقط على تبعيات أو الإضافات.منطقة المشكلة في DefaultMavenProjectBuilder.أساسا أنه لديه مشكلة في تحديد مستودع للبحث عن الوالدين لتحديد ما أحدث أو الإصدار هو.لست متأكدا لماذا هذا يختلف عن تبعيات أو الإضافات على الرغم من.


يبدو أن هذه لن تكون أقل إيلاما من الحاجة إلى تحديث تطلع اللاعبون النجوم على كل تغيير في الأصل بوم.

نصائح أخرى

ما يمكنك القيام به هو استخدام خصائص مخضرم المساعد.هذا سوف تتيح لك تحديد الممتلكات الخاصة بك في ملف خارجي, وسوف المساعد قراءة هذا الملف.

مع هذا التكوين :

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0-alpha-1</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>read-project-properties</goal>
                    </goals>
                    <configuration>
                        <files>
                            <file>my-file.properties</file>
                        </files>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

وإذا كان لديك في خصائص الملف ما يلي:

spring-version=1.0
mysql-version=4.0.0

ثم إنه نفس الشيء كما لو كنت كتبت ، pom.xml فإن السطور التالية:

<properties>
    <spring-version>1.0</spring-version>
    <mysql-version>4.0.0</mysql-version>
</properties>

باستخدام هذا البرنامج المساعد ، سيكون لديك العديد من الفوائد:

  • تعيين بسهولة قائمة طويلة من خصائص
  • تعديل قيم هذه الخصائص دون تعديل الوالدين pom.xml.

وأعتقد أن خصائص مخضرم البرنامج المساعد هو النهج الصحيح على المدى الطويل، ولكن كما استجابت لهذا الجواب أنه لا يسمح خصائص لتكون موروثة. هناك بعض المرافق في تقاسم مخضرم-الإعلام والتوعية التي تسمح لك لاكتشاف الموارد على CLASSPATH المشروع. لقد تضمنت بعض التعليمات البرمجية أدناه الذي يمتد خصائص المساعد للعثور على الملفات العقارات في تبعيات البرنامج المساعد.

والتكوين يعلن مسار لملف خصائص، لأن أعلن المشروع اصف على تكوين المساعد، فإنه يمكن الوصول إلى ClasspathResourceLocatorStrategy. يمكن تعريف التكوين في المشروع الأصل، وسوف تكون موروثة من قبل كافة المشاريع الطفل (إذا قمت بذلك تجنب تعلن أي الملفات لأنها لن يتم اكتشافها، فقط تعيين الملكية فيليباثس).

والتكوين يفترض أدناه أن هناك مشروع آخر يسمى جرة name.seller.rich:test-properties-descriptor:0.0.1 يحتوي على ملف يسمى external.properties تعبئتها في جرة (أي تم تعريفه في SRC / الرئيسية / موارد).

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>properties-ext-maven-plugin</artifactId>
  <version>0.0.1</version>
  <executions>
    <execution>
      <id>read-properties</id>
      <phase>initialize</phase>
      <goals>
        <goal>read-project-properties</goal>
      </goals>
    </execution>
  </executions>                              
  <configuration>
    <filePaths>
      <filePath>external.properties</filePath>
    </filePaths>
  </configuration> 
  <dependencies>
    <!-- declare any jars that host the required properties files here -->
    <dependency>
      <groupId>name.seller.rich</groupId>
      <artifactId>test-properties-descriptor</artifactId>
      <version>0.0.1</version>
    </dependency>
  </dependencies>
</plugin>

ووبوم للمشروع البرنامج المساعد يبدو مثل هذا:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>properties-ext-maven-plugin</artifactId>
  <packaging>maven-plugin</packaging>
  <version>0.0.1</version>
  <dependencies>
    <dependency>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>properties-maven-plugin</artifactId>
      <version>1.0-alpha-1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.shared</groupId>
      <artifactId>maven-shared-io</artifactId>
      <version>1.1</version>
    </dependency>
  </dependencies>
</project>

ووموجو هو نسخة من خصائص المساعد لReadPropertiesMojo، مع "فيليباثس" إضافية خاصية تسمح لك لتحديد المسار النسبي إلى خصائص الخارجية ملف في classpath، فإنه يجعل الملكية الملفات اختياري، ويضيف readPropertyFiles ( ) وgetLocation () طرق لتحديد موقع الملفات ودمج أي فيليباثس في مجموعة الملفات قبل المتابعة. لقد علق التغييرات بلدي لجعلها أكثر وضوحا.

package org.codehaus.mojo.xml;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file 
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, 
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 * KIND, either express or implied.  See the License for the 
 * specific language governing permissions and limitations 
 * under the License.
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.io.location.ClasspathResourceLocatorStrategy;
import org.apache.maven.shared.io.location.FileLocatorStrategy;
import org.apache.maven.shared.io.location.Location;
import org.apache.maven.shared.io.location.Locator;
import org.apache.maven.shared.io.location.LocatorStrategy;
import org.apache.maven.shared.io.location.URLLocatorStrategy;
import org.codehaus.plexus.util.cli.CommandLineUtils;

/**
 * The read-project-properties goal reads property files and stores the
 * properties as project properties. It serves as an alternate to specifying
 * properties in pom.xml.
 * 
 * @author <a href="mailto:zarars@gmail.com">Zarar Siddiqi</a>
 * @author <a href="mailto:Krystian.Nowak@gmail.com">Krystian Nowak</a>
 * @version $Id: ReadPropertiesMojo.java 8861 2009-01-21 15:35:38Z pgier $
 * @goal read-project-properties
 */
public class ReadPropertiesMojo extends AbstractMojo {
    /**
     * @parameter default-value="${project}"
     * @required
     * @readonly
     */
    private MavenProject project;

    /**
     * The properties files that will be used when reading properties.
     * RS: made optional to avoid issue for inherited plugins
     * @parameter
     */
    private File[] files;

    //Begin: RS addition
    /**
     * Optional paths to properties files to be used.
     * 
     * @parameter
     */
    private String[] filePaths;
    //End: RS addition

    /**
     * If the plugin should be quiet if any of the files was not found
     * 
     * @parameter default-value="false"
     */
    private boolean quiet;

    public void execute() throws MojoExecutionException {
        //Begin: RS addition
        readPropertyFiles();
        //End: RS addition

        Properties projectProperties = new Properties();
        for (int i = 0; i < files.length; i++) {
            File file = files[i];

            if (file.exists()) {
                try {
                    getLog().debug("Loading property file: " + file);

                    FileInputStream stream = new FileInputStream(file);
                    projectProperties = project.getProperties();

                    try {
                        projectProperties.load(stream);
                    } finally {
                        if (stream != null) {
                            stream.close();
                        }
                    }
                } catch (IOException e) {
                    throw new MojoExecutionException(
                            "Error reading properties file "
                                    + file.getAbsolutePath(), e);
                }
            } else {
                if (quiet) {
                    getLog().warn(
                            "Ignoring missing properties file: "
                                    + file.getAbsolutePath());
                } else {
                    throw new MojoExecutionException(
                            "Properties file not found: "
                                    + file.getAbsolutePath());
                }
            }
        }

        boolean useEnvVariables = false;
        for (Enumeration n = projectProperties.propertyNames(); n
                .hasMoreElements();) {
            String k = (String) n.nextElement();
            String p = (String) projectProperties.get(k);
            if (p.indexOf("${env.") != -1) {
                useEnvVariables = true;
                break;
            }
        }
        Properties environment = null;
        if (useEnvVariables) {
            try {
                environment = CommandLineUtils.getSystemEnvVars();
            } catch (IOException e) {
                throw new MojoExecutionException(
                        "Error getting system envorinment variables: ", e);
            }
        }
        for (Enumeration n = projectProperties.propertyNames(); n
                .hasMoreElements();) {
            String k = (String) n.nextElement();
            projectProperties.setProperty(k, getPropertyValue(k,
                    projectProperties, environment));
        }
    }

    //Begin: RS addition
    /**
     * Obtain the file from the local project or the classpath
     * 
     * @throws MojoExecutionException
     */
    private void readPropertyFiles() throws MojoExecutionException {
        if (filePaths != null && filePaths.length > 0) {
            File[] allFiles;

            int offset = 0;
            if (files != null && files.length != 0) {
                allFiles = new File[files.length + filePaths.length];
                System.arraycopy(files, 0, allFiles, 0, files.length);
                offset = files.length;
            } else {
                allFiles = new File[filePaths.length];
            }

            for (int i = 0; i < filePaths.length; i++) {
                Location location = getLocation(filePaths[i], project);

                try {
                    allFiles[offset + i] = location.getFile();
                } catch (IOException e) {
                    throw new MojoExecutionException(
                            "unable to open properties file", e);
                }
            }

            // replace the original array with the merged results
            files = allFiles;
        } else if (files == null || files.length == 0) {
            throw new MojoExecutionException(
                    "no files or filePaths defined, one or both must be specified");
        }
    }
    //End: RS addition

    /**
     * Retrieves a property value, replacing values like ${token} using the
     * Properties to look them up. Shamelessly adapted from:
     * http://maven.apache.
     * org/plugins/maven-war-plugin/xref/org/apache/maven/plugin
     * /war/PropertyUtils.html
     * 
     * It will leave unresolved properties alone, trying for System properties,
     * and environment variables and implements reparsing (in the case that the
     * value of a property contains a key), and will not loop endlessly on a
     * pair like test = ${test}
     * 
     * @param k
     *            property key
     * @param p
     *            project properties
     * @param environment
     *            environment variables
     * @return resolved property value
     */
    private String getPropertyValue(String k, Properties p,
            Properties environment) {
        String v = p.getProperty(k);
        String ret = "";
        int idx, idx2;

        while ((idx = v.indexOf("${")) >= 0) {
            // append prefix to result
            ret += v.substring(0, idx);

            // strip prefix from original
            v = v.substring(idx + 2);

            idx2 = v.indexOf("}");

            // if no matching } then bail
            if (idx2 < 0) {
                break;
            }

            // strip out the key and resolve it
            // resolve the key/value for the ${statement}
            String nk = v.substring(0, idx2);
            v = v.substring(idx2 + 1);
            String nv = p.getProperty(nk);

            // try global environment
            if (nv == null) {
                nv = System.getProperty(nk);
            }

            // try environment variable
            if (nv == null && nk.startsWith("env.") && environment != null) {
                nv = environment.getProperty(nk.substring(4));
            }

            // if the key cannot be resolved,
            // leave it alone ( and don't parse again )
            // else prefix the original string with the
            // resolved property ( so it can be parsed further )
            // taking recursion into account.
            if (nv == null || nv.equals(nk)) {
                ret += "${" + nk + "}";
            } else {
                v = nv + v;
            }
        }
        return ret + v;
    }

    //Begin: RS addition
    /**
     * Use various strategies to discover the file.
     */
    public Location getLocation(String path, MavenProject project) {
        LocatorStrategy classpathStrategy = new ClasspathResourceLocatorStrategy();

        List strategies = new ArrayList();
        strategies.add(classpathStrategy);
        strategies.add(new FileLocatorStrategy());
        strategies.add(new URLLocatorStrategy());

        List refStrategies = new ArrayList();
        refStrategies.add(classpathStrategy);

        Locator locator = new Locator();

        locator.setStrategies(strategies);

        Location location = locator.resolve(path);
        return location;
    }
    //End: RS addition
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top