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

بالمناسبة ، إذا كنت تكتب في Java ولسبب ما لا تستخدم لومبوك في مشروعك ، فنوصيك بقراءة المقالات حول Habré (
واحد واثنين ). أنا متأكد أنك سوف تحب ذلك!
المشكلة
يتكون المشروع الذي نعمل عليه من عدة وحدات. بعضها (دعنا نسميها الخلفية المشروطة) عندما يتم إطلاق الإصدار يتم تعبئتها في الأرشيف (التسليم) ، وتحميلها على مستودع ومن ثم نشرها على خوادم التطبيقات. الجزء الآخر هو ما يسمى وحدة العميل - تم نشرها في المستودع كمجموعة من القطع الأثرية ، بما في ذلك sources.jar و javadoc.jar. نحن نستخدم لومبوك في جميع الأجزاء ،
وستقوم مافن بعمل كل شيء.
منذ بعض الوقت ، قام أحد مستهلكي خدمتنا بمعالجة مشكلة - لقد حاول تصحيح الوحدة النمطية الخاصة بنا ، لكنه لم يستطع القيام بها ، لأنه sources.jar تفتقر إلى الأساليب (وحتى الطبقات) التي يرغب في تعيين نقطة توقف. نحن في فريقنا نعتقد أن محاولة تحديد المشكلة وحلها بشكل مستقل ، بدلاً من أن تصنع عيبًا بلا تفكير هو عمل لزوج جدير يحتاج إلى التشجيع! :-) لذلك ، تقرر إحضار sources.jar وفقًا لرمز الكود.
مثال
دعنا نتخيل أن لدينا تطبيقًا بسيطًا يتكون من فئتين:
SomePojo.javapackage com.github.monosoul.lombok.sourcesjar; import lombok.Builder; import lombok.Value; @Value @Builder(toBuilder = true) class SomePojo { String someStringField; String anotherStringField; }
Main.java package com.github.monosoul.lombok.sourcesjar; import lombok.val; public final class Main { public static void main(String[] args) { if (args.length != 2) { throw new IllegalArgumentException("Wrong arguments!"); } val pojo = SomePojo.builder() .someStringField(args[0]) .anotherStringField(args[1]) .build(); System.out.println(pojo); } }
وتم بناء تطبيقنا باستخدام Maven:
pom.xml <?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> <artifactId>lombok-sourcesjar</artifactId> <groupId>com.github.monosoul</groupId> <version>1.0.0</version> <packaging>jar</packaging> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.1</version> <configuration> <archive> <manifest> <mainClass>com.github.monosoul.lombok.sourcesjar.Main</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.0.1</version> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
إذا قمت بترجمة هذا المشروع (
mvn compile
) ، ثم
قمت بفك تشفير الرمز الثانوي الناتج ، فإن فئة
SomePojo ستبدو كما يلي:
SomePojo.class package com.github.monosoul.lombok.sourcesjar; final class SomePojo { private final String someStringField; private final String anotherStringField; SomePojo(String someStringField, String anotherStringField) { this.someStringField = someStringField; this.anotherStringField = anotherStringField; } public static SomePojo.SomePojoBuilder builder() { return new SomePojo.SomePojoBuilder(); } public SomePojo.SomePojoBuilder toBuilder() { return (new SomePojo.SomePojoBuilder()).someStringField(this.someStringField).anotherStringField(this.anotherStringField); } public String getSomeStringField() { return this.someStringField; } public String getAnotherStringField() { return this.anotherStringField; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof SomePojo)) { return false; } else { SomePojo other = (SomePojo)o; Object this$someStringField = this.getSomeStringField(); Object other$someStringField = other.getSomeStringField(); if (this$someStringField == null) { if (other$someStringField != null) { return false; } } else if (!this$someStringField.equals(other$someStringField)) { return false; } Object this$anotherStringField = this.getAnotherStringField(); Object other$anotherStringField = other.getAnotherStringField(); if (this$anotherStringField == null) { if (other$anotherStringField != null) { return false; } } else if (!this$anotherStringField.equals(other$anotherStringField)) { return false; } return true; } } public int hashCode() { int PRIME = true; int result = 1; Object $someStringField = this.getSomeStringField(); int result = result * 59 + ($someStringField == null ? 43 : $someStringField.hashCode()); Object $anotherStringField = this.getAnotherStringField(); result = result * 59 + ($anotherStringField == null ? 43 : $anotherStringField.hashCode()); return result; } public String toString() { return "SomePojo(someStringField=" + this.getSomeStringField() + ", anotherStringField=" + this.getAnotherStringField() + ")"; } public static class SomePojoBuilder { private String someStringField; private String anotherStringField; SomePojoBuilder() { } public SomePojo.SomePojoBuilder someStringField(String someStringField) { this.someStringField = someStringField; return this; } public SomePojo.SomePojoBuilder anotherStringField(String anotherStringField) { this.anotherStringField = anotherStringField; return this; } public SomePojo build() { return new SomePojo(this.someStringField, this.anotherStringField); } public String toString() { return "SomePojo.SomePojoBuilder(someStringField=" + this.someStringField + ", anotherStringField=" + this.anotherStringField + ")"; } } }
مختلف تمامًا عما يدور في مصادرنا. أليس كذلك؟ ؛) كما ترون ، إذا قمت بتوصيل مصادر تصحيح
SomePojo وأردت تعيين نقطة توقف ، على سبيل المثال ، في المنشئ ،
فستواجه مشكلة - لا يوجد مكان لتعيين نقطة توقف ، وفئة
SomePojoBuilder غير موجودة على الإطلاق.
ماذا تفعل حيال ذلك؟
كما يحدث في كثير من الأحيان ، هذه المشكلة لديها العديد من الحلول. دعونا ننظر في كل منهم.
لا تستخدم لومبوك
عندما واجهنا هذه المشكلة لأول مرة ، كنا نتحدث عن وحدة نمطية لم يكن فيها سوى فصلين يستخدمان لومبوك. بالطبع ، لم أكن أرغب في رفض ذلك ، لذلك فكرت على الفور في القيام delombok. بعد التحقيق في هذا السؤال ، وجدت بعض الحلول الغريبة باستخدام البرنامج المساعد
Maven's Lombok - البرنامج المساعد
lombok-maven-plugin . في أحدها ، اقترح ، على سبيل المثال ، الاحتفاظ بالمصادر التي يُستخدم فيها لومبوك في دليل منفصل سيتم تنفيذ delombok من أجله ، وستذهب المصادر التي تم إنشاؤها إلى المصادر المولدة ، حيث سيتم تجميعها والانتقال إلى sources.jar. من المحتمل أن يعمل هذا الخيار ، لكن في هذه الحالة ، لن يعمل تسليط الضوء على بناء الجملة في المصادر الأصلية في IDE ، كما هو دليل معهم لن يعتبر دليل المصدر. هذا الخيار لم يناسبني ، وبما أن تكلفة التخلي عن لومبوك في هذه الوحدة كانت منخفضة ، فقد تقرر عدم تضييع الوقت في هذا الأمر ، وتعطيل لومبوك وإنشاء طرق ضرورية من خلال IDE.
بشكل عام ، يبدو لي أن هذا الخيار له الحق في الحياة ، لكن فقط إذا كانت الفصول التي تستخدم لومبوك صغيرة جدًا ونادراً ما تتغير.
Delombok المساعد + sources.jar بناء باستخدام النملة
بعد مرور بعض الوقت ، كان علي أن أعود إلى هذه المشكلة مرة أخرى ، عندما كان السؤال يتعلق بوحدة تستخدم لومبوك بشكل مكثف. بالعودة مرة أخرى إلى دراسة هذه المشكلة ، صادفت
سؤالًا حول stackoverflow ، والذي اقترح تنفيذ delombok للمصادر ، ثم استخدام المصادر في Ant create sources.jar.
تحتاج هنا إلى التنقيب عن سبب احتياجك لإنشاء sources.jar باستخدام Ant ، بدلاً من استخدام المكون الإضافي Source (
maven-source-plugin ). الحقيقة هي أنه لا يمكنك تكوين الدليل المصدر لهذا البرنامج المساعد. ستستخدم دائمًا محتويات خاصية
sourceDirectory
للمشروع.
لذلك ، في حالة مثالنا ، سيبدو pom.xml كما يلي:
pom.xml <?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> <artifactId>lombok-sourcesjar</artifactId> <groupId>com.github.monosoul</groupId> <version>1.0.0</version> <packaging>jar</packaging> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <lombok.version>1.18.2</lombok.version> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.1</version> <configuration> <archive> <manifest> <mainClass>com.github.monosoul.lombok.sourcesjar.Main</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.projectlombok</groupId> <artifactId>lombok-maven-plugin</artifactId> <version>${lombok.version}.0</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>delombok</goal> </goals> </execution> </executions> <configuration> <sourceDirectory>src/main/java</sourceDirectory> <outputDirectory>${project.build.directory}/delombok</outputDirectory> <addOutputDirectory>false</addOutputDirectory> <encoding>UTF-8</encoding> <formatPreferences> <generateDelombokComment>skip</generateDelombokComment> </formatPreferences> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>copy-to-lombok-build</id> <phase>process-resources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> </resource> </resources> <outputDirectory>${project.build.directory}/delombok</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <id>generate-delomboked-sources-jar</id> <phase>package</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <jar destfile="${project.build.directory}/${project.build.finalName}-sources.jar" basedir="${project.build.directory}/delombok"/> </target> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> <executions> <execution> <id>install-source-jar</id> <goals> <goal>install-file</goal> </goals> <phase>install</phase> <configuration> <file>${project.build.directory}/${project.build.finalName}-sources.jar</file> <classifier>sources</classifier> <generatePom>true</generatePom> <pomFile>${project.basedir}/pom.xml</pomFile> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>3.0.0-M1</version> <executions> <execution> <id>deploy-source-jar</id> <goals> <goal>deploy-file</goal> </goals> <phase>deploy</phase> <configuration> <file>${project.build.directory}/${project.build.finalName}-sources.jar</file> <classifier>sources</classifier> <generatePom>true</generatePom> <pomFile>${project.basedir}/pom.xml</pomFile> <repositoryId>someRepoId</repositoryId> <url>some://repo.url</url> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
كما ترون ، فإن التكوين قد نما كثيرًا ، وهو بعيد جدًا عن
lombok-maven-plugin
maven-antrun-plugin
و
maven-antrun-plugin
. لماذا حدث هذا؟ والحقيقة هي أنه منذ أن جمعنا الآن sources.jar مع Ant ، لا يعرف Maven شيئًا عن هذه القطعة. ونحن بحاجة إلى أن نقول له بوضوح كيفية تثبيت هذه الأداة ، وكيفية نشرها وكيفية تعبئة الموارد فيها.
بالإضافة إلى ذلك ، وجدت أنه عند تنفيذ delombok افتراضيًا ، يضيف Lombok تعليقًا على رأس الملفات التي تم إنشاؤها. في هذه الحالة ، يتم التحكم في تنسيق الملفات التي تم إنشاؤها باستخدام الخيارات الموجودة في ملف
lombok.config
، ولكن باستخدام خيارات البرنامج المساعد. قائمة هذه الخيارات لم تكن سهلة. كان من الممكن ، بالطبع ، الاتصال بكنية جرة Lombok باستخدام مفاتيح
delombok
و
--help
delombok
، لكنني
كسالى جدًا لهذا المبرمج ، لذلك عثرت عليها في
أكواد المصدر على github .
ولكن لا يمكن مقارنة حجم التكوين ولا ميزاته مع العيب الرئيسي لهذه الطريقة.
انه لا يحل المشكلة . يتم تصنيف Bytecode من مصدر واحد ، في حين أن الآخرين يدخلون في sources.jar. وعلى الرغم من أن delombok يتم تنفيذه بواسطة لومبوك نفسه ، فستظل هناك اختلافات بين الكود الثاني والمصادر المولدة ، أي أنها لا تزال غير مناسبة لتصحيح الأخطاء. بعبارة ملطفة ، شعرت بالضيق عندما أدركت ذلك.
Delombok المساعد + الملف الشخصي في مخضرم
ماذا تفعل؟ كان لدي sources.jar مع المصادر "الصحيحة" ، لكنها كانت لا تزال مختلفة عن الرمز الفرعي. من حيث المبدأ ، يمكن حل المشكلة عن طريق التجميع من أكواد المصدر الناتجة نتيجة delombok. لكن المشكلة تكمن في أن
maven-compiler-plugin 'لا يمكنه تحديد المسار إلى المصدر. يستخدم دائمًا المصادر المحددة في
sourceDirectory
للمشروع ، مثل
maven-source-plugin
sourceDirectory
maven-source-plugin
. قد يكون من الممكن الإشارة إلى الدليل الذي يتم فيه إنشاء المصادر المحذوفة ، ولكن في هذه الحالة ، عند استيراد مشروع إلى IDE ، لن يتم اعتبار الدليل الذي يحتوي على مصادر حقيقية على هذا النحو ، ولن يعمل تمييز بناء الجملة والميزات الأخرى على الملفات الموجودة فيه. هذا الخيار لم يناسبني أيضًا.
يمكنك استخدام ملفات التعريف! قم بإنشاء ملف تعريف يستخدم فقط عند إنشاء المشروع
sourceDirectory
سيتم استبدال قيمة
sourceDirectory
! ولكن هناك فارق بسيط. لا يمكن
sourceDirectory
علامة
sourceDirectory
إلا داخل علامة
build
في جذر المشروع.
لحسن الحظ ، هناك حل بديل لهذه المشكلة. يمكنك إعلان خاصية سيتم استبدالها بعلامة
sourceDirectory
، وتغيير قيمة هذه الخاصية في ملف التعريف!
في هذه الحالة ، سيبدو تكوين المشروع كما يلي:
pom.xml <?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> <artifactId>lombok-sourcesjar</artifactId> <groupId>com.github.monosoul</groupId> <version>1.0.0</version> <packaging>jar</packaging> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <lombok.version>1.18.2</lombok.version> <origSourceDir>${project.basedir}/src/main/java</origSourceDir> <sourceDir>${origSourceDir}</sourceDir> <delombokedSourceDir>${project.build.directory}/delombok</delombokedSourceDir> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> </dependencies> <profiles> <profile> <id>build</id> <properties> <sourceDir>${delombokedSourceDir}</sourceDir> </properties> </profile> </profiles> <build> <sourceDirectory>${sourceDir}</sourceDirectory> <plugins> <plugin> <groupId>org.projectlombok</groupId> <artifactId>lombok-maven-plugin</artifactId> <version>${lombok.version}.0</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>delombok</goal> </goals> </execution> </executions> <configuration> <sourceDirectory>${origSourceDir}</sourceDirectory> <outputDirectory>${delombokedSourceDir}</outputDirectory> <addOutputDirectory>false</addOutputDirectory> <encoding>UTF-8</encoding> <formatPreferences> <generateDelombokComment>skip</generateDelombokComment> <javaLangAsFQN>skip</javaLangAsFQN> </formatPreferences> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.1</version> <configuration> <archive> <manifest> <mainClass>com.github.monosoul.lombok.sourcesjar.Main</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.0.1</version> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
وهي تعمل على النحو التالي. في خاصية
origSourceDir
المسار إلى الدليل بالمصادر الأصلية ، وفي خاصية
sourceDir
القيمة من
origSourceDir
. في خاصية
delombokedSourceDir
نحدد المسار إلى المصادر التي أنشأتها delombok. وبالتالي ، عند استيراد مشروع إلى IDE ،
origSourceDir
الدليل من
origSourceDir
، وعند إنشاء المشروع ، إذا قمت بتحديد ملف تعريف
build
، فسيتم استخدام دليل
delombokedSourceDir
.
نتيجة لذلك ، حصلنا على رمز ثانوي تم تجميعه من نفس المصادر التي ستندرج في sources.jar ، أي سوف يعمل التصحيح في النهاية. في هذه الحالة ، لا نحتاج إلى تكوين تثبيت قطعة أثرية ونشرها مع المصادر ، لأننا نستخدم
maven-source-plugin
لإنشاء الأداة. صحيح ، يمكن للسحر مع المتغيرات الخلط بين شخص غير مألوف مع الفروق الدقيقة في مافن.
يمكنك
lombok.config
إضافة الخيار
lombok.addJavaxGeneratedAnnotation = true
في
lombok.config
، ثم
lombok.config
التعليقات التوضيحية
@javax.annotation.Generated("lombok")
فوق الشفرة التي تم إنشاؤها في المصادر التي تم إنشاؤها ، مما سيساعد على تجنب الأسئلة مثل "لماذا تبدو التعليمات البرمجية الخاصة بك غريبة جدًا؟ ! " :)
استخدام المهد
أعتقد أنه إذا كنت على دراية بالفعل بـ
Gradle ، فعليك ألا تشرح كل مزاياها على Maven. إذا لم تكن على دراية به بالفعل ، فهناك
لوحة وصل كاملة على المحور سبب كبير للنظر في ذلك! :)
بشكل عام ، عندما فكرت في استخدام Gradle ، توقعت أنه سيكون من الأسهل بكثير القيام بما أحتاجه فيه ، لأنني كنت أعلم أنه يمكنني بسهولة الإشارة إلى ما يمكنني بناءه من مصادر. ترجمة إلى bytecode. كانت المشكلة تنتظرني حيث توقعت على الأقل - لا يوجد برنامج إضافي يعمل على delombok لـ Gradle.
يوجد
هذا المكون الإضافي ، لكن يبدو أنه لا يمكنك تحديد خيارات لتنسيق المصادر المختلسة فيه ، وهو ما لم يناسبني.
هناك
مكون إضافي ، يقوم بإنشاء ملف نصي من الخيارات التي تم تمريره إليه ، ثم تمريره كوسيطة إلى lombok.jar. لم أتمكن من حمله على وضع المصادر التي تم إنشاؤها في الدليل الصحيح ، ويبدو أن هذا يرجع إلى حقيقة أن المسار في الملف النصي مع الوسيطات لم يتم اقتباسه ولم يتم تجاوزه بشكل صحيح. ربما سأفعل فيما بعد طلب سحب إلى مؤلف البرنامج المساعد مع اقتراح لإصلاح.
في النهاية ، قررت أن أذهب في الاتجاه الآخر ووصفت للتو مهمة مع Ant تدعو لتنفيذ delombok ،
في Lombok هناك فقط مهمة Ant لهذا الغرض ، وهي تبدو جيدة:
build.gradle.kts group = "com.github.monosoul" version = "1.0.0" plugins { java } java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } dependencies { val lombokDependency = "org.projectlombok:lombok:1.18.2" annotationProcessor(lombokDependency) compileOnly(lombokDependency) } repositories { mavenCentral() } tasks { "jar"(Jar::class) { manifest { attributes( Pair("Main-Class", "com.github.monosoul.lombok.sourcesjar.Main") ) } } val delombok by creating { group = "lombok" val delombokTarget by extra { File(buildDir, "delomboked") } doLast({ ant.withGroovyBuilder { "taskdef"( "name" to "delombok", "classname" to "lombok.delombok.ant.Tasks\$Delombok", "classpath" to sourceSets.main.get().compileClasspath.asPath) "mkdir"("dir" to delombokTarget) "delombok"( "verbose" to false, "encoding" to "UTF-8", "to" to delombokTarget, "from" to sourceSets.main.get().java.srcDirs.first().absolutePath ) { "format"("value" to "generateDelombokComment:skip") "format"("value" to "generated:generate") "format"("value" to "javaLangAsFQN:skip") } } }) } register<Jar>("sourcesJar") { dependsOn(delombok) val delombokTarget: File by delombok.extra from(delombokTarget) archiveClassifier.set("sources") } withType(JavaCompile::class) { dependsOn(delombok) val delombokTarget: File by delombok.extra source = fileTree(delombokTarget) } }
نتيجة لذلك ، يكون هذا الخيار مكافئًا للخيار السابق.
الاستنتاجات
مهمة تافهة ، في الواقع ، تحولت إلى سلسلة من المحاولات لإيجاد حلول حول القرارات الغريبة لمؤلفين من مافن. بالنسبة لي - يبدو البرنامج النصي Gradle ، على خلفية التكوينات Maven الناتجة ، أكثر وضوحًا ومنطقًا. ومع ذلك ، ربما لم أستطع إيجاد حل أفضل؟ أخبرنا في التعليقات إذا كنت قد حلت مشكلة مماثلة ، وإذا كان الأمر كذلك ، كيف.
شكرا للقراءة!
شفرة المصدر