Bạn chỉ cần triển khai maven-plugin
của riêng mình để đảm bảo việc này cho bạn.
Dưới đây là một ví dụ với cấu trúc sau:
.
|-- pom.xml
|-- plugin
| `-- pom.xml
| `-- src
| `-- main
| `-- java
`-- app
`-- pom.xml
`-- src
`-- main
`-- java
Bạn sẽ cần phải tạo ra một Mojo mà mất tập các thuộc tính như một đầu vào và sau đó lan truyền các thuộc tính cho pom.xml
của app
.pom.xml
thực sự sẽ không được cập nhật mà chỉ là dữ liệu dự án trong đó.
pom.xml
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow</groupId>
<artifactId>Q12082277</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>${project.artifactId}-${project.version}</name>
<modules>
<module>plugin</module>
<module>app</module>
</modules>
</project>
plugin/pom.xml
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.stackoverflow</groupId>
<artifactId>Q12082277</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>Q12082277-plugin</artifactId>
<packaging>maven-plugin</packaging>
<name>${project.artifactId}-${project.version}</name>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
</project>
plugin/src/main/java/com/stackoverflow/Q12082277/plugin/PropertiesMojo.java
package com.stackoverflow.Q12082277.plugin;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
/**
* @author maba, 2012-08-24
*
* @goal extract
*/
public class PropertiesMojo extends AbstractMojo {
private Log log;
/**
* The current project representation.
* @parameter expression="${project}"
* @required
* @readonly
*/
private MavenProject project;
/**
* A properties file
*
* @parameter expression="${propertiesFile}"
* @required
*/
private File propertiesFile;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
log.info("Executing PropertiesMojo on " + propertiesFile.getAbsolutePath());
try {
Properties fileProperties = new Properties();
fileProperties.load(new FileInputStream(propertiesFile));
Properties projectProperties = project.getProperties();
for (Object key : fileProperties.keySet()) {
projectProperties.setProperty((String)key, (String) fileProperties.get(key));
}
project.getProperties().list(System.out);
} catch (FileNotFoundException e) {
throw new MojoFailureException("The file " + propertiesFile.getAbsolutePath() + " was not found!", e);
} catch (IOException e) {
log.error("");
}
}
@Override
public void setLog(Log log) {
this.log = log;
}
}
Bạn sẽ sử dụng plugin này từ sau app/pom.xml
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.stackoverflow</groupId>
<artifactId>Q12082277</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>Q12082277-app</artifactId>
<name>${project.artifactId}-${project.version}</name>
<build>
<plugins>
<plugin>
<groupId>com.stackoverflow</groupId>
<artifactId>Q12082277-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>extract</goal>
</goals>
<configuration>
<propertiesFile>${user.home}/my.properties</propertiesFile>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.stackoverflow.Q12082277.App</mainClass>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
Và sau đó bạn sẽ phải thêm app.properties
sau sẽ hoạt động dưới dạng mẫu và lấy giá trị mà chúng tôi vừa đọc từ tệp và đặt chúng và tạo tệp bê tông app.properties
sẽ có thể truy cập từ bên trong bình.
app/src/main/resources/app.properties
res.dir=${res.dir}
resource.dir=${resource.dir}
bin.dir=${bin.dir}
cfg.dir=${cfg.dir}
Và cuối cùng, đây là một ứng dụng thử nghiệm mà chỉ tải app.properties
từ classpath và in kết quả.
app/src/main/java/com/stackoverflow/Q12082277/App.java
package com.stackoverflow.Q12082277;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @author maba, 2012-08-23
*/
public class App {
public static void main(String[] args) throws IOException {
ClassLoader loader = App.class.getClassLoader();
InputStream in = loader.getResourceAsStream("app.properties");
Properties properties = new Properties();
properties.load(in);
properties.list(System.out);
}
}
Bây giờ bạn có thể đứng trong thư mục trên và thực hiện
mvn install
Sau đó đi xuống vào thư mục app
và thực hiện
mvn exec:java
Và nó sẽ in
-- listing properties --
resource.dir=C://my/stuff/here
cfg.dir=C://my/stuff/here/config
bin.dir=C://my/stuff/here/bin
res.dir=/my/stuff/here
Đó là chính xác những gì bạn muốn.
Tôi đã thấy nhận xét của bạn về plugin, vì vậy, hãy xóa câu trả lời của tôi. Chỉ muốn cho bạn biết rằng dù được duy trì hay không duy trì, nó hoạt động. (hoặc ít nhất, được sử dụng để làm việc). – crnlx
Cảm ơn bạn đã phản hồi. Có, tôi sẽ nghĩ rằng nếu plugin không còn được duy trì hoặc thậm chí được phát triển (nó được liệt kê là "Alpha") thì có thể không phát triển thêm nữa (nghi ngờ) hoặc có cách tốt hơn để thực hiện việc này. Tôi hy vọng một người nào đó sẽ chỉ cho tôi hướng tới "cách tốt hơn". – user1071914
Điều gì đưa bạn đến giả định rằng plugin sẽ không được duy trì nữa? Hơn nữa các thuộc tính bên ngoài dự án Maven sẽ làm cho dự án của bạn phụ thuộc vào những thứ sẽ phá vỡ khái niệm Maven để có mọi thứ cần thiết cho một dự án Maven bên trong dự án. Câu hỏi đặt ra là tại sao bạn cần điều này? – khmarbaise