एक मेवेन बिल्ड में, मैं गतिशील रूप से बाइट कोड जनरेशन लाइब्रेरी (बाइट बडी) का उपयोग करके कुछ जावा प्रकार उत्पन्न कर रहा हूं। स्वाभाविक रूप से, इन वर्ग फ़ाइलों में संबंधित स्रोत फ़ाइलें नहीं हैं। इस तरह से केवल कुछ कक्षाएं उत्पन्न की जाएंगी। इस परियोजना के लिए अधिकांश कोड जावा स्रोत होने जा रहा है। आदर्श रूप से, जावा स्रोत प्रतिबिंबित या रनटाइम कोड पीढ़ी का उपयोग करने के बजाय जनरेट किए गए प्रकारों को स्थिर तरीके से संदर्भित करेगा, जिसका अर्थ है कि कक्षाओं को जावैक के लिए संकलन वर्ग पथ पर होना आवश्यक है। क्या मैं एक ही मेवेन प्रोजेक्ट के लिए संकलित वर्ग पथ पर उत्पन्न वर्ग प्राप्त कर सकता हूं यानी एक अलग मेवेन परियोजना और आर्टिफैक्ट के बिना स्रोत कोड युक्त मेवेन प्रोजेक्ट द्वारा संदर्भित जेनरेट बाइट कोड को पकड़ने के लिए?क्या मैं एक ही मेवेन प्रोजेक्ट में स्रोत फ़ाइल में गतिशील रूप से उत्पन्न और संदर्भित कर सकता हूं?
अद्यतन: मैं पहले से ही, सीधे target/classes
अर्थात project.build.outputDirectory
में उत्पन्न कक्षाएं लगाने की कोशिश की है जल्दी में Maven बिल्ड जीवनचक्र है, लेकिन ऐसा लगता है कि वर्ग के रास्ते पर नहीं है। जेनरेट प्रकारों को मेवेन कंपाइलर प्लगइन या आईडीई द्वारा हल नहीं किया जा सका। मैंने जेनर क्लास युक्त target
के तहत अतिरिक्त संसाधन निर्देशिका जोड़ने के लिए बिल्ड हेल्पर मेवेन प्लगइन का उपयोग करने का भी प्रयास किया, जिसे स्वचालित रूप से target/classes
में कॉपी किया गया था। इस विन्यास ने एक ही समस्या का प्रदर्शन किया।
अद्यतन: मैं GitHub पर एक पूर्ण सार्वजनिक रेपो बनाया है:
<?xml version="1.0" encoding="UTF-8"?>
<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>demo</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>demo-enhanced</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>demo</groupId>
<artifactId>demo-original</artifactId>
<version>${project.version}</version>
<overWrite>true</overWrite>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<includes>**/*.class</includes>
<excludes>META-INF/</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-maven-plugin</artifactId>
<executions>
<execution>
<phase>process-resources</phase>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<initialization>
<entryPoint>net.bytebuddy.test.SimpleEntryPoint</entryPoint>
<groupId>demo</groupId>
<artifactId>demo-transformer</artifactId>
</initialization>
<transformations>
<transformation>
<plugin>net.bytebuddy.test.SimplePlugin</plugin>
<groupId>demo</groupId>
<artifactId>demo-transformer</artifactId>
</transformation>
</transformations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
:
https://github.com/mches/so-42376851
यहाँ परियोजना मैं स्थिर कक्षाओं कि बाइट कोड बढ़ाया वर्गों संदर्भित करना चाहते हैं के लिए Maven पोम है
और यहाँ जनक पोम है:
<?xml version="1.0" encoding="UTF-8"?>
<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>demo</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>demo-original</module>
<module>demo-transformer</module>
<module>demo-enhanced</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<byte-buddy.version>1.6.9</byte-buddy.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>${byte-buddy.version}</version>
</dependency>
<dependency>
<groupId>demo</groupId>
<artifactId>demo-original</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>demo</groupId>
<artifactId>demo-transformer</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>demo</groupId>
<artifactId>demo-enhanced</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-maven-plugin</artifactId>
<version>${byte-buddy.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
foo/Bar.java (मूल स्रोत) :
package foo;
public class Bar {
}
शुद्ध/bytebuddy/परीक्षण/SimplePlugin.java (बाइट कोड बढ़ाने):
package net.bytebuddy.test;
import net.bytebuddy.build.Plugin;
import net.bytebuddy.description.modifier.Visibility;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.FieldAccessor;
public class SimplePlugin implements Plugin {
@Override
public boolean matches(TypeDescription target) {
return target.getName().equals("foo.Bar");
}
@Override
public DynamicType.Builder<?> apply(DynamicType.Builder<?> builder, TypeDescription typeDescription) {
if (typeDescription.getTypeName().equals("foo.Bar")) {
builder = builder.defineField("qux", String.class, Visibility.PRIVATE)
.defineMethod("getQux", String.class, Visibility.PUBLIC)
.intercept(FieldAccessor.ofField("qux"))
.defineMethod("setQux", void.class, Visibility.PUBLIC)
.withParameter(String.class)
.intercept(FieldAccessor.ofField("qux"));
}
return builder;
}
}
foo/Baz.java (स्थिर स्रोत फ़ाइल गतिशील प्रकार को संदर्भित):
package foo;
public class Baz {
private Bar bar = new Bar();
public String getQuux() {
return bar.getQux();
}
public void setQuux(String quux) {
bar.setQux(quux);
}
}
अद्यतन: मेवेन एक बाध्य कोड और स्थैतिक वर्ग स्रोत कोड के साथ समेकित मॉड्यूल को शामिल करने वाली संरचना को समझता प्रतीत होता है, प्रत्येक के लिए अलग मॉड्यूल के रूप में अच्छी तरह से, लेकिन आईडीई, इंटेलिजे और ग्रहण, मेवेन के तरीके के आधार पर किसी भी संरचना के लिए वर्ग पथ को समझने में विफल रहता है।
शायद आप जैक्स-बी का एक स्रोत स्रोत कोड ले सकते हैं: xjc यह सिमिल करता है उत्पन्न स्रोत चरण – HRgiger